【发布时间】:2013-12-04 06:41:26
【问题描述】:
我正在尝试解决如何标记唯一(我所称的)块(或段,如果你愿意的话),这些块具有基于开始和结束的连续“Trip”行,由“epoch”排序,共享相同的“代码” '。在这种情况下,按“行程”分组,“代码”将不起作用,因为我需要测量“代码”的持续时间在行程中保持不变。我曾尝试使用 CTE,但我无法对数据进行分区,以提供如下所示的所需结果。我显示的区块编号可以是任何值,只要它是唯一的,以便它按照“时代”的顺序标记旅行中相同“代码”的连续出现。
有什么想法吗?
declare @data table (id int, trip int, code int NULL, epoch int, value1 int, value2 int);
insert into @data (id, trip, code, epoch, value1, value2)
values
(1, 1, null, 31631613, 0, 0),
(2, 2, 1, 31631614, 10, 40),
(3, 1, 1, 31631616, 10, 60),
(4, 1, 1, 31631617, 40, 60),
(5, 2, 1, 31631617, 23, 40),
(6, 2, 2, 31631620, 27, 40),
(7, 2, 2, 31631629, 23, 40),
(9, 1, 1, 31631618, 39, 60),
(10, 1, null, 31631621, 38, 60),
(12, 1, null, 31631625, 37, 60),
(15, 1, null, 31631627, 35, 60),
(19, 1, 1, 31631630, 39, 60),
(20, 1, 1, 31631632, 40, 60),
(21, 2, 1, 31631629, 23, 40);
block id trip code epoch value1 value2
1 1 1 NULL 31631613 0 0
2 2 2 1 31631614 10 40
2 5 2 1 31631617 23 40
3 3 1 1 31631616 10 60
3 4 1 1 31631617 40 60
3 9 1 1 31631618 39 60
4 6 2 2 31631620 27 40
4 7 2 2 31631629 23 40
5 10 1 NULL 31631621 38 60
5 12 1 NULL 31631625 37 60
5 15 1 NULL 31631627 35 60
6 19 1 1 31631630 39 60
6 20 1 1 31631632 40 60
7 21 2 1 31631629 23 40
【问题讨论】:
-
什么版本的sql server?
-
另外,为什么输出中的最后一行 (trip=2, code=1, epoch=31631629) 不是第四行...与其他 trip=2, code=1记录? trip=1, code=1 行的相同问题。
-
SQL 2008 R2 并感谢我在深夜打卡时收到的随机数据。当我一天后回到这个问题时,我也注意到了这一点。无论如何,我已经取得了一些进展,这将有所帮助。
-
这是一个“缝隙和孤岛”问题,我已经添加了相应的标签。
-
谢谢'Andriy M',我完全不知道这个词。这将有助于缩小范围。
标签: sql-server common-table-expression gaps-and-islands