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
我正在计算每个 ClientID 和 月 的 Type 数量,使用这个基本查询:
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中有两个字段)