我有一种情况,我的数据是
#SourceData
表的格式,我需要将其转换为#FinalData
表的格式,示例代码如下。
稍微口头解释一下,
RowNumber
表的#SourceData
列是对日期进行排序的,按TrackingNumber
列分组。 RowNumber
列中具有奇数的日期将进入 Date1
,偶数的日期将进入 Date2
。
看起来这可能是一个枢轴,但不完全是,它开始让我的大脑融化。 请注意,一个 TrackingNumber(不包括)有超过 100 个日期。
示例数据:
CREATE Table #SourceData (
TrackingNumber int NULL
,Date1 date NULL
,Date2 date NULL
,RowNumber int NULL
);
INSERT INTO #SourceData
SELECT 3 , '09/18/2016', NULL, 1
UNION SELECT 3 , '12/21/2016', NULL, 2
UNION SELECT 12 , '01/30/2018', NULL, 1
UNION SELECT 12 , '01/30/2018', NULL, 2
UNION SELECT 12 , '03/01/2019', NULL, 3
UNION SELECT 12 , '03/05/2019', NULL, 4
UNION SELECT 12 , '04/19/2020', NULL, 5
UNION SELECT 23 , '02/14/2017', NULL, 1
UNION SELECT 130 , '04/12/2017', NULL, 1
----------------------------------------
CREATE Table #FinalData (
TrackingNumber int NULL
,Date1 date NULL
,Date2 date NULL
);
INSERT INTO #FinalData
SELECT 3 , '09/18/2016', '12/21/2016'
UNION SELECT 12 , '01/30/2018', '01/30/2018'
UNION SELECT 12 , '03/01/2019', '03/05/2019'
UNION SELECT 12 , '04/19/2020', NULL
UNION SELECT 23 , '02/14/2017', NULL
UNION SELECT 130 , '04/12/2017', NULL
这符合我认为所需的输出:
select distinct
TrackingNumber
, case when RowNumber % 2 > 0 then Date1
else lag(date1,1) over(partition by TrackingNumber order by RowNumber)
end as Date1
, case when RowNumber % 2 = 0 then Date1
else lead(date1,1) over(partition by TrackingNumber order by RowNumber)
end as Date2
from #SourceData
追踪号码 | 日期1 | 日期2 |
---|---|---|
3 | 2016-09-18 | 2016-12-21 |
12 | 2018-01-30 | 2018-01-30 |
12 | 2019-03-01 | 2019-03-05 |
12 | 2020-04-19 | 空 |
23 | 2017-02-14 | 空 |
130 | 2017-04-12 | 空 |