Postgres:使用重叠的组成员对数据进行分组

时间:2019-08-27 20:39:59

标签: postgresql group-by grouping

我有一个具有数百万行的data_points表,如下所示:

data_stream_id   time_slot              value
1                2019-01-01 00:00:00    100
2                2019-01-01 00:00:00    35
3                2019-01-01 00:00:00    80
1                2019-01-01 00:00:01    110
2                2019-01-01 00:00:01    30
3                2019-01-01 00:00:01    70
1                2019-01-01 00:00:02    120
2                2019-01-01 00:00:02    30
3                2019-01-01 00:00:02    50

我需要获取data_stream组的时间序列数据(如果有多个data_stream,则将值相加)。

例如针对群组:

group_id    data_streams
a           1, 3
b           3

我想要结果:

group_id         time_slot              value
a                2019-01-01 00:00:00    180
a                2019-01-01 00:00:01    180
a                2019-01-01 00:00:02    170
b                2019-01-01 00:00:00    80
b                2019-01-01 00:00:01    70
b                2019-01-01 00:00:02    50

棘手的部分是data_stream可以包含在多个组中。因此,我不能只从data_points表中做一个简单的SELECT(因为那将只允许对每个data_point进行一次计数)。我尝试将LEFT JOIN映射到values,如下所示:

SELECT    v.group_id, dp.time_slot, sum(dp.value)
FROM      data_points dp
LEFT JOIN (values (1,'a'),(3,'a'),(3,'b')) as v(data_stream_id, group_id)
ON        dp.data_stream_id = v.data_stream_id
GROUP BY  v.group_id, dp.time_slot
ORDER BY  v.group_id, dp_time_slot

但是,在大型团体中,这种伸缩性会很差吗?如果它在多个组中,则基本上复制data_stream的行。

有有效的方法吗?

1 个答案:

答案 0 :(得分:1)

demo:db<>fiddle

我不确定您为什么使用//This is what StringBuilder internally does on calling toString() Method char[] charArray = "\u0048\u0065\u006C\u006C\u006F World".toCharArray(); String output = new String(charArray, 0, charArray.length); //To do it in single line String output = new StringBuilder("\u0048\u0065\u006C\u006C\u006F World").toString(); 而不是LEFT (OUTER) JOIN(INNER) JOIN仅在任何组都没有包含的时隙时才有意义(在您的情况下,LEFT JOIN;请参见小提琴)。但是您只对那些具有相关组的数据集感兴趣。因此,您应该改用简单的data_stream_id = 2

JOIN