回答

收藏

SQL Server 2012年编号岛

技术问答 技术问答 236 人阅读 | 0 人回复 | 2023-09-14

我需要在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确定新岛屿开始的地方。总和只是这个标志。
分享到:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则