Sql server 在CTE-SQL Server中创建块

Sql server 在CTE-SQL Server中创建块,sql-server,common-table-expression,gaps-and-islands,Sql Server,Common Table Expression,Gaps And Islands,我正在尝试找出如何标记我正在调用的块或段的唯一性,如果您希望这些块或段具有由“epoch”排序的基于开始和结束的连续“Trip”行,它们共享相同的“代码”。在这种情况下,按“行程”分组,“代码”将不起作用,因为我需要测量“代码”在行程中保持不变的持续时间。我曾尝试使用CTE,但我无法以如下所示的方式对数据进行分区。我所显示的区块编号可以是任何值,只要它是唯一的,以便按照“历元”顺序标记行程中相同“代码”的连续出现 有什么想法吗 declare @data table (id int, trip

我正在尝试找出如何标记我正在调用的块或段的唯一性,如果您希望这些块或段具有由“epoch”排序的基于开始和结束的连续“Trip”行,它们共享相同的“代码”。在这种情况下,按“行程”分组,“代码”将不起作用,因为我需要测量“代码”在行程中保持不变的持续时间。我曾尝试使用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

好的,无论如何它都不是完美的,但它是一个启动器,至少可以识别连续块的开始和结束,其中“代码”在行程中保持不变。为了至少能有所贡献,我会把我写的东西贴出来。如果我有时间做一件合适的工作,我会把它贴出来

declare @minint int; set @minint = -2147483648;
declare @maxint int; set @maxint = 2147483647;
declare @id_data table (pk int IDENTITY(1,1), id int, trip int, code int NULL, epoch int, value1 int, value2 int);

insert into @id_data VALUES(@minint, @minint, @minint, @minint, @minint, @minint);
insert into @id_data
SELECT id, trip, coalesce(code,0), epoch, value1, value2
  FROM @data
order by trip, epoch, code;
insert into @id_data VALUES(@maxint, @maxint, @maxint, @maxint, @maxint, @maxint);

WITH CTE as 
(
SELECT pk, id, trip, code, epoch, value1, value2, ROW_NUMBER() OVER (PARTITION BY trip ORDER BY epoch) as row_num
FROM @id_data
)
SELECT B.*, A.code, C.min_next_code 
FROM CTE A
INNER JOIN CTE B ON (B.pk = A.pk + 1) AND (A.code != B.code) -- SELECTS THE RECORDS     THAT START A NEW GROUP
OUTER APPLY (
SELECT min_next_code = MIN(pk) - 1 -- LOCATION OF NEXT GROUP
FROM CTE
WHERE pk > B.pk AND (trip = B.trip) AND (code != B.code)
) C
WHERE B.id < @maxint

你没有更新你的预期输出,所以我仍然不能100%确定这是你想要的,但是试试看

SELECT 
    DENSE_RANK() OVER (ORDER BY trip, code), 
    * 
FROM 
    @data
ORDER BY 
    trip, code, epoch

sql server的哪个版本?另外,为什么输出trip=2、code=1、epoch=31629中的最后一行不是第四行。。。另一个跳闸记录是否为2,代码是否为1?对于trip=1,code=1行,同样的问题。sql2008r2&感谢dazed收集了我深夜输入的随机数据。一天后,当我回到这个问题时,我也注意到了这一点。无论如何,我已经取得了一些进展,这将有所帮助。这是一个缺口和岛屿问题,我已经添加了一个相应的标签。谢谢“安德烈M”,我完全不知道这个词。这将有助于缩小范围。谢谢你的帮助,我想需要更多的澄清。最终目标是测量行程代码开始和行程代码更改代码/行程结束时的历元差异。将“代码”想象成一个警报级别,其中业务KPI可能会确保相同的警报不会持续30秒,但稍后可能会继续并发出警报,但它被视为KPI度量的新案例。