SQL - GROUP BY 同一列的 3 个值

Posted

技术标签:

【中文标题】SQL - GROUP BY 同一列的 3 个值【英文标题】:SQL - GROUP BY 3 values of the same column 【发布时间】: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?没有要使用的年份或日期列? 【参考方案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 的最佳选择。 我已更正

以上是关于SQL - GROUP BY 同一列的 3 个值的主要内容,如果未能解决你的问题,请参考以下文章

SQL GROUP BY COUNT 并包含 0 个值

C# Linq to SQL — Group by

SQL聚合使用一一列的group by

SQL选择列的总和最大的行(在GROUP BY中有两个字段)

GROUP BY 一列但不是同一表中的另一列-SQL [重复]

mybatis使用group by分组