按两列分组,其中一列是时间戳

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_idtimestamp 列代表每个 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 错误消息中还有更多信息吗? 我的语法对我来说似乎也不错。错误消息中没有更多信息。 也许它实际上来自您用来执行查询的代码?可以分享一下吗?

以上是关于按两列分组,其中一列是时间戳的主要内容,如果未能解决你的问题,请参考以下文章

按两列分组并根据其中一列计算累积值

PostgreSQL - 按两列分组并使用一列作为结果列

Pandas 数据框:按两列分组,然后对另一列进行平均

在按两列分组时选择最大值,并在另一列上排序

Pandas:按两列分组,将第一列组中的第一个值相加

如何在R中按两列分组