|
我需要在SQL Server
/ ?6 }! p9 m' e$ E- A. O2 t2012年,孤岛被编号。孤岛被定义为一组行,其中同一行之间DateFrom和DateTo没有日间空白ItemId。" b! W# q5 J; ~
以下数据集:$ K; k; ^: a, }$ |
CREATE TABLE #Ranges (ItemId INT,DateFrom DATETIME,DateTo DATETIME)INSERT INTO #Ranges VALUES (1,'2015-01-31','2015-02-17')INSERT INTO #Ranges VALUES (1,'2015-02-18','2015-03-31')INSERT INTO #Ranges VALUES (1,'2015-04-14','2015-05-21')INSERT INTO #Ranges VALUES (2,'2015-07-12','2015-07-19')INSERT INTO #Ranges VALUES (2,'2015-07-20','2015-07-24')INSERT INTO #Ranges VALUES (2,'2015-07-26','2015-08-02')INSERT INTO #Ranges VALUES (2,'2015-08-03','2015-08-07')编号如下:% A# a( ^) ^, A2 Q8 P1 y
ItemId; DateFrom; DateTo; Number1. 2015年 -01-31; 2015-02-17; 11. 2015年 -02-18; 2015-03-31; 11. 2015年 -04-14; 2015-05-21; 22; 2015-07-12; 2015-07-19; 32; 2015-07-20; 2015-07-24、 32; 2015年-07-26; 2015-08-02; 42; -08-03; 2015-08-07; 4感谢任何帮助。
2 q; |+ ]" C7 V& \% l! i此致Przemek
# A5 K" p5 {! y, L, l- ]; m
8 W0 t+ L7 a( B/ N* F4 K: t) ? d 解决方案:
5 B T" f/ N# @6 Y1 e% y: T: {3 l( C 如果你只想编号它们,我建议你lag()使用一个累加的总和:. }1 I4 d2 C+ T- h! R
select t.*, sum(case when datefrom = dateadd(day,1,prev_dateto then 0 else end) over (order by itemId,datefrom)from (select t.*, lag(dateto) over (partition by itemid order by datefrom) as prev_dateto from table t ) t;在case确定新岛屿开始的地方。总和只是这个标志。 |
|