【问题标题】:SQL - GROUP BY 3 values of the same columnSQL - GROUP BY 同一列的 3 个值
【发布时间】:2021-12-29 14:00:10
【问题描述】:

我在 GBQ 有这张表:

ClientID     Type     Month
  XXX         A         4
  YYY         C         4
  FFX         B         5
  FFF         B         6
  XXX         C         6
  XXX         A         6
  YRE         C         7
  AAR         A         7
  FFF         A         8
  EGT         B         8   
  FFF         B         9
  ETT         C         9   

我正在计算每个 ClientIDType 数量,使用这个基本查询:

SELECT    ClientID,
          COUNT(DISTINCT Type) NbTypes,
          Month
FROM      Table
GROUP BY  ClientID, Month

结果如下所示:

ClientID     NbTypes     Month
  XXX           1         4
  XXX           2         6
  FFF           1         6
  FFF           1         8
  FFF           1         9
  ...          ...       ...

我需要做的是,计算 每个 ClientID 的类型数每个月:过去 3 个月。

例如:

  • 对于ClientID = XXX 和Month = 8 :我想要Type 的计数,其中Month = 6 AND @ 987654328@ = 7 AND Month = 8

有没有办法用GROUP BY 做到这一点?

谢谢

【问题讨论】:

  • 如果当前月份是1(一月)应该如何进行计算
  • @GeorgeJoseph 这将是第 1 个月。对于 2 月,它将是 1 和 2。它应该总结过去 3 个月,但如果它们不存在,则计为 0
  • 您是否只有月份列作为 int?没有要使用的年份或日期列?

标签: sql google-bigquery


【解决方案1】:

您可以在语句中使用 HAVING:

SELECT    ClientID,
          COUNT(DISTINCT Type) NbTypes,
          Month
FROM      Table
GROUP BY  ClientID, Month
HAVING Month = EXTRACT(MONTH FROM CURRENT_DATE()) 
       OR Month = EXTRACT(MONTH FROM DATE_SUB(DATE_TRUNC(CURRENT_DATE(), MONTH), INTERVAL 1 MONTH))
       OR Month = EXTRACT(MONTH FROM DATE_SUB(DATE_TRUNC(CURRENT_DATE(), MONTH), INTERVAL 2 MONTH))

请注意,您的表中似乎没有确定年份的列,因此该语句会将所有值与当前月份的月份值分组到当前月份减去两个月。例如,此查询将选择 12 月、11 月和 2021 年 10 月、2020 年、2019 年等的所有数据。

另外请注意,我无法测试此语句,因为我不使用 BigQuery。
这是日期函数的来源: https://cloud.google.com/bigquery/docs/reference/standard-sql/date_functions

【讨论】:

    【解决方案2】:

    如果 Google Big Query 允许,您可以在 SELECT 中使用 SELECT

    SELECT    ClientID,
              COUNT(DISTINCT Type) NbTypes,
              Month,
              MAX((select count(distinct Type)
                     from Table t2
                    where t1.ClientID=t2.ClientID
                      and t1.month-t2.month between 0 and 2               
                   )
                 )   as NbType_3_months
    FROM      Table t1
    GROUP BY  ClientID, Month
    

    【讨论】:

    • 这几年都行不通。
    • 没错,原始查询是按 ClientID、Month 本身分组的。因此,ClientID 可能不会跨越数年
    • 我想我们真的不知道这些是日历的序号还是月份。
    • 您不应该需要max(),因为它与分组列相关。范围应该是 0 到 2。否则我怀疑子查询是 BigQuery 的最佳选择。
    • 我已更正
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-04
    • 1970-01-01
    • 2012-02-29
    • 2011-10-21
    • 2014-08-29
    相关资源
    最近更新 更多