【发布时间】:2018-06-21 21:02:44
【问题描述】:
我想构建一个查询,它不是按值本身分组数据,而是按行之间值变化的事实来分组数据。我将不胜感激任何帮助!这是一个例子:
假设我有一个具有这种结构的表:
create table events (
event_time timestamp,
source_id integer references source(id),
metric integer,
flagged boolean
);
以及以下示例数据:
source_id | event_time | metric | flagged
-----------------------------------------
1 | 8:00 | 1 | t
1 | 8:10 | 15 | f
1 | 8:20 | 7 | t
1 | 8:30 | 3 | t
1 | 8:40 | 6 | f
1 | 8:50 | 10 | t
2 | 9:00 | 5 | t
我想查询metric 的平均值,以source_id 为组的子组,但根据flagged 不会从一行更改为下一行的事实对这些子组进行分组,前提是数据是有序的。也就是说,在上面的示例中,我不是指group by source_id, flagged,因为这只会为每个source_id 提供两个组,而是将连续行分组,按时间排序,其中flagged 在相邻的行。也就是说,我想有以下组:
group_number | source_id | flagged | avg(metric)
------------------------------------------------
1 | 1 | t | 1 -- group includes entry for 8:00 only
2 | 1 | f | 15 -- entry for 8:15 only
3 | 1 | t | 5 -- entries on 8:20 & 8:30, (7+3)/2
4 | 1 | f | 6 -- entry for 8:40 only
5 | 1 | t | 10 -- entry for 8:50 only
6 | 2 | t | 5 -- 9:00 from source_id = 2
group_number 在输出中不需要,它在这里只是为了使大小写更清楚。此外,我不需要不是 flagged 的条目 - 基本上它们仅用于拆分组。
我试图通过分区和ranks 和lags 来做到这一点,但到目前为止无济于事。将不胜感激任何帮助!谢谢。
【问题讨论】:
标签: sql postgresql group-by