所以,我已经对此进行了一些研究,但我似乎无法找到一种方法来访问当前在 SELECT 语句中创建的 SAME 列中的前一行。我知道我可以使用 lag() 访问前一行的另一个现有列的值,但不能访问正在创建的列。
本质上,我的目标是:
如果:id与上一行的id不同,则使用当前row_order作为new_order
如果:Type 是“start”,使用当前的 row_order 作为 new_order
Else:使用上一行的row_order作为new_order
例如,在这个示例代码中,结果几乎是正确的,但在结果行 7-8 上不完全正确。这是因为我实际上并没有访问同一列中的前一行,我正在加入一个相同的表偏移一行。相反,第 7-8 行的 [new_order] 列应该都是“5”。
电流输出
row_order id Type new_order
1 11 start 1
2 11 go 1
3 11 start 3
4 11 go 3
5 12 start 5
6 12 go 5
7 12 go 6
8 12 go 7
期望的输出
row_order id Type new_order
1 11 start 1
2 11 go 1
3 11 start 3
4 11 go 3
5 12 start 5
6 12 go 5
7 12 go 5
8 12 go 5
DECLARE @t TABLE (row_order INT, id INT, Type VARCHAR(100));
INSERT INTO @t VALUES
(1, 11, 'start'),
(2, 11, 'go'),
(3, 11, 'start'),
(4, 11, 'go'),
(5, 12, 'start'),
(6, 12, 'go'),
(7, 12, 'go'),
(8, 12, 'go');
WITH rcte AS (
SELECT *
, row_order AS new_order
FROM @t
WHERE row_order = 1
UNION ALL
SELECT curr.*
,CASE
WHEN curr.id <> prev.id THEN curr.row_order
WHEN curr.Type = 'start' THEN curr.row_order
ELSE prev.row_order
END AS new_order
FROM @t AS curr
JOIN rcte AS prev ON curr.row_order = prev.row_order + 1
)
SELECT *
FROM rcte
我能够做到这一点 Qlik 的数据加载编辑器,因为他们有这个 peek() 函数,但我需要找到一种方法在 sql 中做到这一点 https://help.qlik.com/en-US/qlikview/May2022/Subsystems/Client/Content/QV_QlikView/Scripting/InterRecordFunctions/Peek.htm