按两列分组,其中一列是时间戳
Posted
技术标签:
【中文标题】按两列分组,其中一列是时间戳【英文标题】:group by on two columns one of which is timestamp 【发布时间】:2020-05-06 01:06:23 【问题描述】:我有一个 SQL 数据表,其中包含如下数据:
t_id | s_id | timestamp | column1 | column2
-------------------------------------------------------------------
111 | 312552 | 2019-01-01 13:00:00.000000 | 8.8911 | 12.1123
111 | 412522 | 2019-01-01 14:00:00.000000 | 8.0001 | 22.1234
111 | 112999 | 2019-01-01 15:00:00.000000 | 18.8901 | 42.9746
111 | 312555 | 2019-01-01 16:00:00.000000 | 0.1195 | 11.5824
...
...
...
222 | 332552 | 2019-01-01 13:00:00.000000 | 0.0011 | 33.1323
222 | 442522 | 2019-01-01 14:00:00.000000 | 8.5501 | 20.1111
222 | 112465 | 2019-01-01 15:00:00.000000 | 1.0905 | 40.1476
222 | 313333 | 2019-01-01 16:00:00.000000 | 5.2295 | 14.4444
...
...
345 | 333352 | 2019-01-01 13:00:00.000000 | 0.0011 | 12.9045
345 | 444422 | 2019-01-01 14:00:00.000000 | 8.5501 | 2.50476
345 | 112265 | 2019-01-01 15:00:00.000000 | 1.0905 | 90.1111
345 | 316633 | 2019-01-01 16:00:00.000000 | 5.2295 | 44.0000
在表中,每个s_id
对应一个唯一的t_id
。 timestamp
列代表每个 s_id
的一整年(8760 小时)。我想处理这些数据,以便对于每个t_id
,输出数据具有以下列:
t_id | timestamp | sum_column1 | sum_column2
----------------------------------------------------------------
111 | 2019-01-01 00:00:00.000000 | 8998.8911 | 111112.1123
........ (rest of 8759 hours for t_id = 111) ....................
222 | 2019-01-01 00:00:00.000000 | 1111.1234 | 965464.1123
........ (rest of 8759 hours for t_id = 222) ....................
sum_column1
应该是按 t_id 和时间戳分组的 column1 的总和,sum_column2
也是如此
我为此编写的查询(如下所示)不起作用,但如果我将timestamp
放在date()
函数中,则可以。但在后一种情况下,它只是 date,(不是 datetime,这是预期的结果)。如何修改此查询以输出按t_id
分组的结果并报告timestamp
select
t_id,
timestamp,
sum(column1) as sum_column1,
sum(column2) as sum_column2
from
data_table
where
t_id in (111, 222)
group by
timestamp,
t_id
order by
timestamp,
t_id
查询导致以下错误消息,但我没有看到任何语法错误:
亚马逊无效操作:“,”位置或附近的语法错误:37;
PS:我正在开发 Amazon Redshift
【问题讨论】:
我不明白您的结果集由什么组成。所有时间戳是串联在一起还是在不同的行中。 我收到一个错误:[Amazon](500310) 无效操作:在“,”位置或附近出现语法错误:37; 您认为查询无效的原因是什么?如果您使用 date(),它将截断时间,汇总每个日期而不是每小时的数据,因此听起来不像您所追求的。如果您只是将时间戳移动到要排序的第二列,那不会给您所需的结果吗? (所有这些都会改变结果显示的顺序,但会通过 t_id 将它们组合在一起,就像在您想要的结果的示例中一样) 【参考方案1】:看起来你想使用窗口函数而不是聚合:
select
t_id,
"timestamp",
sum(column1) over (partition by t_id) as sum_column1,
sum(column2) over (partition by t_id) as sum_column2
from
data_table
where
t_id in (111, 222)
order by
t_id,
"timestamp"
PostgreSQL demo on dbfiddle
【讨论】:
我试过了,结果如下:[Amazon](500310) 无效操作:在“,”或附近出现语法错误,位置:37; (我在上面的问题中得到了与原始查询类似的错误,但我没有看到任何语法错误) @Vakratund 这绝对是有效的 postgresql 语法,请参阅db-fiddle.com/f/kku3XHLnvyqtmX9ixGL2vM/0,我看不出任何关于 redshift 的错误。 @Vakratund 错误消息中还有更多信息吗? 我的语法对我来说似乎也不错。错误消息中没有更多信息。 也许它实际上来自您用来执行查询的代码?可以分享一下吗?以上是关于按两列分组,其中一列是时间戳的主要内容,如果未能解决你的问题,请参考以下文章