上一个值和当前值
我想旋转以下数据,以便根据列rn中的值可以获得前一列和当前列。如果只有一条记录,那么当前值和以前的值将是相同的值。 (我使用SSMS 2008)基于上述数据上一个值和当前值
CREATE TABLE #TEST1
(ACCT_ID INT, RN INT, LoadDate Date)
INSERT INtO #TEST1 VALUES (1, 1, '2016-12-21')
INSERT INtO #TEST1 VALUES (2, 1, NULL)
INSERT INtO #TEST1 VALUES (3, 1, '2017-10-06')
INSERT INtO #TEST1 VALUES (3, 2, NULL)
INSERT INtO #TEST1 VALUES (4, 1, '2016-12-21')
SELECT * FROM #TEST1
ACCT_ID RN LoadDate
1 1 2016-12-21
2 1 NULL
3 1 2017-10-06
3 2 NULL
4 1 2016-12-21
,我做枢轴表
SELECT ACCT_ID, [1] as Prev, [2] as Curr FROM
(
SELECT * fROM #TEST1 S
pivot( MAX(LoadDate) for RN IN ([1],[2])) U
)X
例如如何ACCT_ID 1和4具有在电流相同的值与先前值。
我不知道,如果将支点在这种情况下工作,我很抱歉,如果你特别是使用旋转需要一个答案。
在这里,我通过子查询获取MAX(RN),然后为前一个和当前LoadDate执行select语句。当前日期是由MAX(RN)提供的日期。如果MAX(RN)大于1,则前一个日期是MAX(RN) - 1的日期,否则它是RN等于1的前一个日期。
SELECT dT.ACCT_ID
,(SELECT T1.LoadDate FROM #TEST1 T1 WHERE T1.ACCT_ID = dT.ACCT_ID AND T1.RN = CASE WHEN dT.MaxRN = 1 THEN 1 ELSE dT.MaxRN - 1 END) [Prev]
,(SELECT T1.LoadDate FROM #TEST1 T1 WHERE T1.ACCT_ID = dT.ACCT_ID AND T1.RN = dT.MaxRN) [Curr]
FROM (
SELECT ACCT_ID
,MAX(RN) [MaxRN]
FROM #TEST1
GROUP BY ACCT_ID
) AS dT
我会用有条件聚集:
select acct_id,
max(case when rn = 1 then loaddate end) as load_date,
max(case when rn = 2 then loaddate end) as load_date_prev
from #test1 t
group by acct_id;
这没有奏效。 ID 1和4在load_date_prev中具有空值,而不是具有与load_date相同的值 – user3059409
我猜你需要这样的事情。如果Prev
为空,它将显示Curr
值。
select acct_id, curr, case when prev = ' ' then null else coalesce(prev, curr) end
from
(
SELECT acct_id,
max(CASE WHEN RN = 1 THEN loaddate END) as Curr,
max(CASE WHEN RN = 2 THEN coalesce(loaddate, ' ') END) as Prev
FROM #test1 t
GROUP BY acct_id
) t
这有效,但它影响ID 3.该记录具有2行数据。第一个有一个值,第二个没有,我希望它保持那样... – user3059409
@ user3059409是的,它有'null'值被取代...我会考虑它 –
@ user3059409现在试一试 –
显示需要的结果。 –