我有一张非常简单的表格:
create table tmp(
id int,
source_id int,
event_user varchar,
event_date timestamp
);
这是数据:
insert into tmp(id, source_id, event_user, event_date)
values (1, 1, 'A', now()),
(2, 1, 'A', now()+interval '1 day'),
(3, 1, 'B', now()+interval '2 day'),
(4, 1, 'B', now()+interval '3 day'),
(5, 1, 'A', now()+interval '4 day'),
(6, 1, 'A', now()+interval '5 day'),
(7, 1, 'A', now()+interval '6 day'),
(8, 2, 'A', now()+interval '7 day'),
(9, 2, 'B', now()+interval '8 day'),
(10, 2, 'A', now()+interval '9 day'),
(11, 2, 'B', now()+interval '10 day'),
(12, 2, 'B', now()+interval '11 day') ;
(为了简单起见,我只是在event_Date列中的"now"时间戳中添加了1天,以显示时间序列.在实际情况下,无法对事件_日期的分布做出任何假设.实际情况下的列"id"和"source_id"也属于uuid类型.)
当我查询此表时:
select * from tmp
order by event_date;
我得到: initial data
id | source_id | event_user | event_date |
---|---|---|---|
1 | 1 | A | 03-05-2024 |
2 | 1 | A | 04-05-2024 |
3 | 1 | B | 05-05-2024 |
4 | 1 | B | 06-05-2024 |
5 | 1 | A | 07-05-2024 |
6 | 1 | A | 08-05-2024 |
7 | 1 | A | 09-05-2024 |
8 | 2 | A | 10-05-2024 |
9 | 2 | B | 11-05-2024 |
10 | 2 | A | 12-05-2024 |
11 | 2 | B | 13-05-2024 |
12 | 2 | B | 14-05-2024 |
现在,问题在于,我需要额外的列(series_id),它标识属于同一source_id和server_user的顺序(按Events_Date的顺序)记录组.
因此,当我查询时,我希望得到以下结果:
id | source_id | SERIES_ID | event_user | event_date |
---|---|---|---|---|
1 | 1 | 1 | A | 03-05-2024 |
2 | 1 | 1 | A | 04-05-2024 |
3 | 1 | 2 | B | 05-05-2024 |
4 | 1 | 2 | B | 06-05-2024 |
5 | 1 | 3 | A | 07-05-2024 |
6 | 1 | 3 | A | 08-05-2024 |
7 | 1 | 3 | A | 09-05-2024 |
8 | 2 | 1 | A | 10-05-2024 |
9 | 2 | 2 | B | 11-05-2024 |
10 | 2 | 3 | A | 12-05-2024 |
11 | 2 | 4 | B | 13-05-2024 |
12 | 2 | 4 | B | 14-05-2024 |
我try 过窗口函数(rank()、dense_rank()),但没有成功,当然是因为预期组中的记录除了在时间上是"结果"之外没有共同特征.可能这是一种"差距和岛屿"问题,但不幸的是我不知道如何解决它.