SQL - 有没有办法访问当前正在创建的同一列中的前一行?类似于 QLIK 中的 Peek() 函数

问题描述 投票:0回答:0

所以,我已经对此进行了一些研究,但我似乎无法找到一种方法来访问当前在 SELECT 语句中创建的 SAME 列中的前一行。我知道我可以使用 lag() 访问前一行的另一个现有列的值,但不能访问正在创建的列。

本质上,我的目标是:

  1. 如果:id与上一行的id不同,则使用当前row_order作为new_order

  2. 如果:Type 是“start”,使用当前的 row_order 作为 new_order

  3. 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

sql qlikview
© www.soinside.com 2019 - 2024. All rights reserved.