【问题标题】:Counting row entries in BigQuery table grouped on a time interval using SQL使用 SQL 计算按时间间隔分组的 BigQuery 表中的行条目
【发布时间】:2021-11-15 12:08:22
【问题描述】:

我在这个 BigQuery/SQL 问题上遇到了一些死胡同。经过大约 1 小时的谷歌搜索后,我仍然没有弄清楚,所以我想我会在这里问。

我有一个包含客户订单数据的 BigQuery 表 (mycompany.engagement.product_orders)。表中的每一行都描述了客户下的订单,看起来像这样:

Row Product Timestamp Type CustomerName
1 Apple 2021-08-19 11:41:08.874 UTC Gala Philippe Kahn
2 Orange 2021-08-19 11:41:12.874 UTC Navel Grace Hopper
3 Pear 2021-08-19 11:41:24.874 UTC Bosc Vladimir Nabokov
4 Apple 2021-08-19 11:41:47.874 UTC Melba Sylvia Plath
5 Pear 2021-08-19 11:41:55.874 UTC Anjou Alan Turing
6 Pear 2021-08-19 11:42:10.874 UTC Asian Sylvia Plath
7 Apple 2021-08-19 11:42:11.874 UTC Fuji Vladimir Nabokov
8 Orange 2021-08-19 11:42:37.874 UTC Blood Ada Lovelace
9 Orange 2021-08-19 11:42:49.874 UTC Cara Grace Hopper
10 Apple 2021-08-19 11:42:51.874 UTC Melba Alan Turing

我想制定一个 SQL 查询,它将以 1 分钟的间隔(或任何间隔)计算客户订购的产品,以返回一个看起来像这样(某种东西)的表:

Row Product Timestamp Count
1 Apple 2021-08-19 11:41:00.000 UTC 2
2 Orange 2021-08-19 11:41:00.000 UTC 1
3 Pear 2021-08-19 11:41:00.000 UTC 2
4 Pear 2021-08-19 11:42:00.000 UTC 1
5 Apple 2021-08-19 11:42:00.000 UTC 2
6 Orange 2021-08-19 11:42:00.000 UTC 2

一些注意事项:

我发现的相关示例(例如:https://dba.stackexchange.com/questions/179823/grouping-count-by-interval-of-15-minutes)倾向于为所有行条目提供计数,而不是按增量上的列值聚合。我知道这可能可以使用 partition by 或 group by 语句,但我不完全确定或者我将如何将它们组合在一起。如果这不可能,那就太好了 - 我的 SQL 技能还很初级。

尝试: 按照上面发布的链接的框架,这与我的有点相似:

SELECT 
    DATE_ADD(MINUTE, (DATEDIFF(MINUTE, '20000101', timestamp) / 1)*1, '20000101'),
    count(*)
FROM 
    mycompany.engagement.product_orders
GROUP BY
    DATE_ADD(MINUTE, (DATEDIFF(MINUTE, '20000101', timestamp) / 1)*1, '20000101')

返回:

Unrecognized name: MINUTE at [2:14]

【问题讨论】:

    标签: sql datetime time group-by google-bigquery


    【解决方案1】:

    你想使用date_trunc():

    SELECT DATE_TRUNC(timestamp, MINUTE) as tm,
           COUNT(*)
    FROM  mycompany.engagement.product_orders
    GROUP BY tm;
    

    【讨论】:

    • 感谢您的快速回复!我不得不稍微修改这个查询(缺少逗号):``` SELECT DATE_TRUNC(timestamp, MINUTE) as tm, COUNT(*) FROM mycompany.engagement.product_orders GROUP BY tm; ``` 但是现在如何计算按产品分组的每分钟间隔内的出现次数?
    【解决方案2】:

    考虑以下方法

    select Product, 
      timestamp_trunc(Timestamp, minute) Timestamp,
      count(1) `Count`
    from `mycompany.engagement.product_orders`
    group by 1, 2        
    

    如果应用于您问题中的样本数据 - 输出是

    【讨论】:

    • 很高兴,它对你有用。如果有帮助,还可以考虑对答案进行投票:o)
    猜你喜欢
    • 2021-01-03
    • 2016-05-16
    • 2019-08-07
    • 2016-04-15
    • 1970-01-01
    • 2011-07-02
    • 2016-09-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多