Sql server 在CTE-SQL Server中创建块
我正在尝试找出如何标记我正在调用的块或段的唯一性,如果您希望这些块或段具有由“epoch”排序的基于开始和结束的连续“Trip”行,它们共享相同的“代码”。在这种情况下,按“行程”分组,“代码”将不起作用,因为我需要测量“代码”在行程中保持不变的持续时间。我曾尝试使用CTE,但我无法以如下所示的方式对数据进行分区。我所显示的区块编号可以是任何值,只要它是唯一的,以便按照“历元”顺序标记行程中相同“代码”的连续出现 有什么想法吗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
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度量的新案例。