簡體   English   中英

GroupBy +條件

[英]GroupBy + Condition

如果我有一張桌子

ID | Start  | End    | Name | Code
1  | 1000   | 1001   | ABC1 |  A
1  | 1000   | 1001   | FSD1 |  B
2  | 1200   | 1201   | CC12 |  A
3  | 4000   | 4002   | GF41 |  B
3  | 4000   | 4002   | ML65 |  A     

如果有條件,我們可以使用SQL Standard編寫以下代碼:

如果對於(ID,開始,結束),代碼是A和B,則僅打印帶有B的記錄。否則,打印記錄。 這是輸出:

ID | Start  | End    | Name | Code
1  | 1000   | 1001   | FSD1 |  B
2  | 1200   | 1201   | CC12 |  A
3  | 4000   | 4002   | GF41 |  B

謝謝!

以下是BigQuery Standrad SQL

#standardSQL
WITH `project.dataset.your_table`  AS (
  SELECT 1 id, 1000 start, 1001 `end`, 'ABC1' name, 'A' code UNION ALL
  SELECT 1, 1000, 1001, 'FSD1', 'B' UNION ALL
  SELECT 2, 1200, 1201, 'CC12', 'A' UNION ALL
  SELECT 3, 4000, 4002, 'GF41', 'B' UNION ALL
  SELECT 3, 4000, 4002, 'ML65', 'A' 
)
SELECT 
  id, start, `end`, 
  ARRAY_AGG(STRUCT(name, code) ORDER BY code DESC LIMIT 1)[OFFSET(0)].*
FROM `project.dataset.your_table`
GROUP BY id, start, `end` 
-- ORDER BY id

結果應該是

Row id  start   end     name    code     
1   1   1000    1001    FSD1    B    
2   2   1200    1201    CC12    A    
3   3   4000    4002    GF41    B     

具有相同結果的替代選項,但在表中需要包含到輸出中的更多/其他字段時很有用

#standardSQL
WITH `project.dataset.your_table`  AS (
  SELECT 1 id, 1000 start, 1001 `end`, 'ABC1' name, 'A' code UNION ALL
  SELECT 1, 1000, 1001, 'FSD1', 'B' UNION ALL
  SELECT 2, 1200, 1201, 'CC12', 'A' UNION ALL
  SELECT 3, 4000, 4002, 'GF41', 'B' UNION ALL
  SELECT 3, 4000, 4002, 'ML65', 'A' 
)
SELECT row.*
FROM (
  SELECT ARRAY_AGG(t ORDER BY code DESC LIMIT 1)[OFFSET(0)] row
  FROM `project.dataset.your_table` t
  GROUP BY id, start, `end` 
)
-- ORDER BY id

您可以使用row_number()進行此操作:

select t.*
from (select t.*,
             row_number() over (partition by id order by code desc) as seqnum
      from t
     ) t
where seqnum = 1;

與聚合方法相比,此方法的優點在於,它很容易包含所有列,而沒有聚合的開銷。

暫無
暫無

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

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