我有一个具有数百万行的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的行。
有有效的方法吗?
答案 0 :(得分:1)
我不确定您为什么使用//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