按eventid分区逐行递增seid字段值的SQL实现求助
问题
我有一张包含eventid、seid、rowNo字段的数据表,需要按eventid分区,每行的seid值基于分区内前一行的值递增1(分区首行保留原seid值)。我尝试用LAG窗口函数写了SQL,但没得到预期结果,请求解决。
现有数据表
| eventid | seid | rowNo |
|---|---|---|
| 900253 | 2 | 1 |
| 900253 | 0 | 2 |
| 900253 | 0 | 3 |
| 900253 | 0 | 4 |
| 942484 | 69 | 5 |
| 942484 | 0 | 6 |
| 942484 | 0 | 9 |
期望输出表
| eventid | seid | rowNo |
|---|---|---|
| 900253 | 2 | 1 |
| 900253 | 3 | 2 |
| 900253 | 4 | 3 |
| 900253 | 5 | 4 |
| 942484 | 69 | 5 |
| 942484 | 70 | 6 |
| 942484 | 71 | 9 |
尝试的SQL语句
select eventname, eventid, subeventid,max_seid,seid, rn, LAG (seid, 1, 1) OVER ( partition by eventid order by eventname ) as realseid from newtest
解决方案
你之前用LAG函数的思路无法实现需求——LAG仅能获取前一行的原始值,没法完成递增加1的累积计算。正确的做法是结合FIRST_VALUE和ROW_NUMBER窗口函数来实现:
SELECT eventid, -- 分区首行seid + 行号偏移量(行号从0开始) FIRST_VALUE(seid) OVER (PARTITION BY eventid ORDER BY rowNo) + ROW_NUMBER() OVER (PARTITION BY eventid ORDER BY rowNo) - 1 AS seid, rowNo FROM 你的数据表名 ORDER BY rowNo;
逻辑说明
FIRST_VALUE(seid) OVER (PARTITION BY eventid ORDER BY rowNo):获取每个eventid分区内的第一个seid值(即分区首行的原始值)。ROW_NUMBER() OVER (PARTITION BY eventid ORDER BY rowNo):在每个分区内按rowNo排序生成行号,首行是1,后续依次递增。- 用首行
seid加上(行号-1),即可实现首行保持原值、后续每行递增1的效果。
注意事项
- 将SQL中的
你的数据表名替换为实际表名。 - 你尝试的SQL中出现了
eventname、subeventid等未在数据表中列出的字段,需根据实际业务需求调整查询的字段列表。
内容的提问来源于stack exchange,提问作者Suvarna Lakshmi
相关产品推荐
相关产品推荐

