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:在大组内给每个小组赋予序号,合并各组到记录级。
SPL开源地址
