求个SQL语句,一条实现我的需求
date_entrydate_change name_clerkid_deptid_ndept id_post id_npost
2009/8/12012/2/1A20101201032010620105
2009/8/12011/3/31A20101201012010520106
2008/3/12012/2/1B20101201032010620105
2009/7/12011/6/3C40200209062010520105
2009/7/12011/5/7C20103201022010620105
2009/7/12011/3/31C20101201032010620106
想要每个用户的第一行的date_entry不变,第二行的date_entry 为上一行用户的date_change。以此类推!最后能到的结果是
date_entry date_changename_clerkid_deptid_ndept id_postid_npost
2009/8/12012/2/1A20101201032010620105
2012/2/12011/3/31A20101201012010520106
2008/3/12012/2/1B20101201032010620105
2011/5/72011/6/3C40200209062010520105
2011/3/312011/5/7C20103201022010620105
2009/7/12011/3/31C20101201032010620106
[解决办法]
declare @tab table(date_entry datetime,date_change datetime,id varchar(10))
insert into @tab
select '2009/8/1','2012/2/1','A' union
select '2009/8/1','2011/3/31','A' union
select '2008/3/1','2012/2/1','B' union
select '2009/7/1','2011/6/3','C' union
select '2009/7/1','2011/5/7','C' union
select '2009/7/1','2011/3/31','C'
;with tab as(
select *,ROW_NUMBER() over(partition by id order by id) rid from @tab
)
select date_entry=case
when rid=1 then date_entry
else (select date_change from tab t where t.id=tab.id and t.rid=tab.rid-1) end
,date_change,id from tab
-------------------------------------------------
2009-08-01 00:00:00.0002011-03-31 00:00:00.000A
2011-03-31 00:00:00.0002012-02-01 00:00:00.000A
2008-03-01 00:00:00.0002012-02-01 00:00:00.000B
2009-07-01 00:00:00.0002011-03-31 00:00:00.000C
2011-03-31 00:00:00.0002011-05-07 00:00:00.000C
2011-05-07 00:00:00.0002011-06-03 00:00:00.000C
[解决办法]
declare @table_b table
(date_entry datetime,date_change datetime,
name_clerk varchar(24),id_dept int ,id_ndept int,
id_post int ,id_npost int)
insert into @table_b
Select '2009/8/1' ,'2012/2/1', 'A' ,20101,20103,20106,20105
union select
'2009/8/1','2011/3/31','A',20101,20101, 20105,20106
union select
'2008/3/1','2012/2/1','B',20101,20103,20106,20105
union select
'2009/7/1','2011/6/3','C',40200,20906 ,20105 ,20105
union select
'2009/7/1' ,'2011/5/7', 'C' ,20103,20102,20106,20105
union select
'2009/7/1','2011/3/31','C',20101,20103,20106,20106 ;
with ta as
(
Select *, ROW_NUMBER() over(partition by name_clerk order by name_clerk) rid from @table_b
)
Select tttt =
case when rid = 1 then date_entry else
(select a.date_change from ta a where a.name_clerk = b.name_clerk and a.rid = b.rid - 1) end,
date_change ,name_clerk
From ta b