【问题标题】:Select highest count per day in BigQuery在 BigQuery 中选择每天的最高计数
【发布时间】:2023-04-02 14:05:01
【问题描述】:

我正在尝试编写一个查询,该查询将返回一系列 BigQuery 表中每天计数最高的条目。

我只写了以下查询,它返回每天的所有条目及其计数,按天排序,然后按条目最高的产品从高到低排序。

SELECT 
   STRFTIME_UTC_USEC(UTC_USEC_TO_day((ts-25200000)*1000),"%Y-%m-%d") AS day,
   products.id as product, 
   count(products.id) as num_entries
FROM 
   TABLE_DATE_RANGE([table_name_], timestamp('20170801'), timestamp(current_date()))
GROUP BY day, product
ORDER BY day, num_entries desc

例如

2017-08-01 . product A . 10
2017-08-01 . product B . 8
2017-08-01 . product C . 4
2017-08-01 . product D . 2
2017-08-02 . product X . 18
2017-08-02 . product Y . 15
2017-08-02 . product Z . 11
2017-08-03 . product N . 20
2017-08-03 . product M . 12
2017-08-03 . product N . 5
2017-08-03 . product O . 3
...

如何更改查询以仅返回每天的最高条目(最高 num_entries)?

例如

2017-08-01 . product A . 10
2017-08-02 . product X . 18
2017-08-03 . product N . 20
...

【问题讨论】:

    标签: sql google-bigquery


    【解决方案1】:

    如果出于某种原因您仍然需要 BigQuery Legacy SQL - 请在下面使用
    只需用很少的额外逻辑包装您的原始查询

    #legacySQL
    SELECT 
      day, 
      product, 
      num_entries
    FROM (
      SELECT 
        day, 
        product, 
        num_entries, 
        ROW_NUMBER() OVER(PARTITION BY day ORDER BY num_entries DESC) AS win
      FROM (
      -- your original query START
        SELECT 
           STRFTIME_UTC_USEC(UTC_USEC_TO_day((ts-25200000)*1000),"%Y-%m-%d") AS day,
           products.id as product, 
           COUNT(products.id) as num_entries
        FROM 
           TABLE_DATE_RANGE([table_name_], TIMESTAMP('20170801'), TIMESTAMP(CURRENT_DATE()))
        GROUP BY day, product        )
      -- your original query END
    )
    WHERE win = 1  
    

    同时,将 migrating 考虑为 BigQuery 标准 SQL
    在您的情况下,查询将如下所示

    #standardSQL
    WITH days AS (
      SELECT
        PARSE_DATE('%Y%m%d', _TABLE_SUFFIX) AS day,
        products.id AS product,
        COUNT(*) AS num_entries
      FROM `table_name_*`
      WHERE _TABLE_SUFFIX >= '20170801'
      GROUP BY day, product
    )
    SELECT top.* FROM (
      SELECT ARRAY_AGG(days ORDER BY num_entries DESC LIMIT 1)[OFFSET(0)] AS top
      FROM days
      GROUP BY day
    ) 
    

    您可以开始使用问题中的虚拟数据进行简化查询

    #standardSQL
    WITH days AS (
      SELECT '2017-08-01' AS day, 'product A' AS product, 10 AS num_entries UNION ALL
      SELECT '2017-08-01', 'product B', 8 UNION ALL
      SELECT '2017-08-01', 'product C', 4 UNION ALL
      SELECT '2017-08-01', 'product D', 2 UNION ALL
      SELECT '2017-08-02', 'product X', 18 UNION ALL
      SELECT '2017-08-02', 'product Y', 15 UNION ALL
      SELECT '2017-08-02', 'product Z', 11 UNION ALL
      SELECT '2017-08-03', 'product N', 20 UNION ALL
      SELECT '2017-08-03', 'product M', 12 UNION ALL
      SELECT '2017-08-03', 'product N', 5 UNION ALL
      SELECT '2017-08-03', 'product O', 3
    )
    SELECT top.* FROM (
      SELECT ARRAY_AGG(days ORDER BY num_entries DESC LIMIT 1)[OFFSET(0)] AS top
      FROM days
      GROUP BY day
    )
    

    结果如预期:

    Row day         product     num_entries  
    1   2017-08-01  product A   10   
    2   2017-08-03  product N   20   
    3   2017-08-02  product X   18   
    

    【讨论】:

      【解决方案2】:

      这应该可以,但请注意,您应该使用standard SQL 进行查询:

      #standardSQL
      WITH ProductCounts AS (
        SELECT
          PARSE_DATE('%Y%m%d', _TABLE_SUFFIX) AS date,
          products.id AS product,
          COUNT(*) AS num_entries
        FROM `your_table_*`
        WHERE _TABLE_SUFFIX >= '20170801'
        GROUP BY date, product
      )
      SELECT
        date,
        ARRAY_AGG(product ORDER BY num_entries DESC LIMIT 1)[OFFSET(0)] AS top_product
      FROM ProductCounts
      GROUP BY date;
      

      【讨论】:

      • 遗憾的是,我的组织仍在使用旧版 SQL,但感谢您的回答!我正在研究标准 SQL 文档,以了解您编写的所有内容如何协同工作。
      • 当然,没问题。不过,对于这个特定的查询,仍然可以使用标准 SQL,对吧? Google 内部的团队也会发生同样的事情——他们在迁移到后者时混合使用旧版 SQL 和标准 SQL。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-01-31
      • 2020-03-23
      • 2020-01-06
      • 2018-02-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多