*SQL,给连续的行加上标识序号
postgresql 数据库的表 tmp 有 2 个分组字段,source_id 和 event_user,将该表按 source_id 分组,组内按 event_date 排序后,event_user 相同的值会形成有序的小组:
id |
source_id |
event_user |
event_date |
1 |
1 |
A |
05-03-2014 |
2 |
1 |
A |
06-03-2014 |
3 |
1 |
B |
07-03-2014 |
4 |
1 |
B |
08-03-2014 |
5 |
1 |
A |
09-03-2014 |
6 |
1 |
A |
10-03-2014 |
7 |
1 |
A |
11-03-2014 |
8 |
2 |
A |
12-03-2014 |
9 |
2 |
B |
13-03-2014 |
10 |
2 |
A |
14-03-2014 |
11 |
2 |
B |
15-03-2014 |
12 |
2 |
B |
16-03-2014 |
现在要增加计算列SERIES_ID,在source_id内按顺序给每个有序小组加序号。
id |
source_id |
SERIES_ID |
event_user |
event_date |
1 |
1 |
1 |
A |
05-03-2014 |
2 |
1 |
1 |
A |
06-03-2014 |
3 |
1 |
2 |
B |
07-03-2014 |
4 |
1 |
2 |
B |
08-03-2014 |
5 |
1 |
3 |
A |
09-03-2014 |
6 |
1 |
3 |
A |
10-03-2014 |
7 |
1 |
3 |
A |
11-03-2014 |
8 |
2 |
1 |
A |
12-03-2014 |
9 |
2 |
2 |
B |
13-03-2014 |
10 |
2 |
3 |
A |
14-03-2014 |
11 |
2 |
4 |
B |
15-03-2014 |
12 |
2 |
4 |
B |
16-03-2014 |
编写SPL代码:
A |
|
1 |
=post1.query("select id, source_id, SERIES_ID, event_user, event_date from data order by source_id,event_date") |
2 |
=A1.group@o(source_id).(~.group@o(event_user)) |
3 |
=A2.conj@r(~.run( ~.run( SERIES_ID=get(1,#)))) |
A1:SQL取数,按source_id,event_date排序,其中SERIES_ID 为空。
A2:不排序,按source_id相邻的值分组,组内按 event_user 相邻的值再分小组。
A3:在大组内给每个小组赋予序号,合并各组到记录级。
来源:https://stackoverflow.com/questions/78422651/identify-groups-of-sequential-records
英文版 https://c.scudata.com/article/1724138612207
考虑:T.group@o(source_id).run(~.run(if(#==1:a=1,source_id!=source_id[-1]:a+=1),SERIES_ID=a))
大佬,这里是不是要这样: event_user!=event_user[-1]:a+=1
循环赋值即可, A1.run(SERIAL_NO=ranki(event_user;source_id))