[英]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.