SQL 滞后增量 1

SQL Lag Increment By 1

提问人:GBM 提问时间:8/28/2023 最后编辑:marc_sGBM 更新时间:8/28/2023 访问量:132

问:

我正在尝试使用 LAG 函数将 1 添加到每一行,并将“1”作为默认值。例如;

SELECT 
    T.NAME,
    T.SESSION,
    LAG (CASE WHEN T.SESSION = 2023 THEN '1' END, 1, 0) OVER (ORDER BY T.NAME) + 1 AS 'SESSION_ORDER'
FROM 
    TABLE T 
WHERE 
    T.SESSION >= 2023

查询将返回 4 行,我想要的是在派生列中将第一行的默认值设置为 1,然后对于后续行,每次递增 1,以便接下来的三行;SESSION_ORDER

2
3
4

我遇到的问题是结果如下;

1
2
NULL
NULL

更新:如果有人想运行查询或类似的查询,我使用了 sqlliteonline.com 中的演示选择查询;

SELECT 
    id, name,
    LAG (CASE WHEN name = 'CREATE' THEN 1 END, 1, 0) OVER (ORDER BY ID) + 1
FROM 
    demo
WHERE 
    NAME IN ('CREATE', 'SELECT', 'INSERT', 'UPDATE');

输出为:

1
2
NULL
NULL
sql-server 自动递增

评论

4赞 Martin Smith 8/28/2023
不用于此目的。滞后不会创建递增序列row_numberlag
1赞 eshirvana 8/28/2023
@GBM您做错了什么,或者所有会话 ID 都等于 0
3赞 topsail 8/28/2023
重复:使用,不是row_numberlag
1赞 eshirvana 8/28/2023
然后阅读 LAG() 文档,你不知道 LAG 实际上做了什么
1赞 eshirvana 8/28/2023
然后更新您的问题并显示您想要的输出,似乎您需要使用 row_number() 窗口函数而不是 LAG

答:

2赞 Joaquin 8/28/2023 #1

以下是使用以下方法修改原始查询的方法:ROW_NUMBER

SELECT 
T.NAME,
T.SESSION,
ROW_NUMBER() OVER (ORDER BY T.NAME) AS 'SESSION_ORDER'
FROM TABLE T 
WHERE T.SESSION >= 2023;

对于 sqlliteonline.com 上的演示查询:

SELECT 
id,
name,
ROW_NUMBER() OVER (ORDER BY ID) AS 'SESSION_ORDER'
FROM demo
WHERE NAME IN ('CREATE','SELECT','INSERT','UPDATE');

这将根据指定的子句,为结果集中的每一行提供从 1 开始并递增 1 的序列。ORDER BY