簡體   English   中英

SQL - GROUP BY 同一列的 3 個值

[英]SQL - GROUP BY 3 values of the same column

我在 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   

我正在計算每個ClientIDMonth的 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 Month = 7 AND Month = 8

有沒有辦法用GROUP BY做到這一點?

謝謝

如果 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 3               
               )
             )   as NbType_3_months
FROM      Table t1
GROUP BY  ClientID, Month

您可以在聲明中使用 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

可以按ClientID和Month對行進行分組,統計類型數,按ClientID升序排列,按Month降序排列,然后每組select最近三個月的行。 在 SQL 中處理這種情況是迂回和復雜的,因為 SQL 僅在中途實現集合定向。 對於您的情況,您必須為每個 ClientID 獲取最大的月份,通過連接過濾器找到符合條件的記錄,然后進行分組和計數。 通常的做法是從數據庫中取出原始數據,在Python或者SPL中進行處理。 SPL,開源 Java package,更容易集成到 Java 程序中,生成更簡單的代碼。 它只用兩行代碼就完成了任務:

一種
1個 =GBQ.query("SELECT CLIENTID, COUNT(DISTINCT TYPE) AS NBTYPES, MONTH FROM t2 GROUP BY CLIENTID, MONTH ORDER BY CLIENTID, MONTH DESC")
2個 =A1.group@o(#1).run(m=~.#3-3,~=~.select(MONTH>m)).conj()

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM