簡體   English   中英

如何根據條件聚合數據

[英]How to aggregate data based on conditions

有下表:

+--------+-------+-------+-------+
| categ. | elem. | atr_1 | atr_2 |
+--------+-------+-------+-------+
|      1 |     1 |     2 |     1 |
|      1 |     2 |     2 |     2 |
|      2 |     3 |     1 |     3 |
|      2 |     4 |     1 |     3 |
+--------+-------+-------+-------+

...我正在嘗試獲取顯示每個類別最佳元素的結果表:

+--------+--------+
| categ. | elem.  |
+--------+--------+
|      1 |      2 |
|      2 |      3 |
+- ------+--------+

為了確定哪個元素是每個類別的“最佳”,系統需要檢查每個類別哪個元素具有 max(atr_1)。 如果檢索到多個元素,將查看檢索到的元素的 max(atr_2)。 如果檢索到多個元素,則其中一個結果將隨機分配給該類別。

我無法弄清楚如何聚合和使用條件語句來編寫所需的查詢。 有什么建議嗎?

我在 Google BigQuery 中使用標准 SQL。

提前致謝

我們可以在這里使用ROW_NUMBER

WITH cte AS (
    SELECT *, ROW_NUMBER() OVER (PARTITION BY category ORDER BY atr_1 DESC, atr_2 DESC) rn
    FROM yourTable
)

SELECT category, element
FROM cte
WHERE rn = 1;

解決這個問題的 BigQuery'ish 方法只使用聚合:

select (array_agg(t order by atr_1 desc, atr_2 desc limit 1))[ordinal(1)].* except (atr_1, atr_2)
from t
group by categ;

以下是 BigQuery 標准 SQL

#standardSQL
SELECT AS VALUE 
  ARRAY_AGG(
    STRUCT(categ, elem) ORDER BY atr_1 DESC, atr_2 DESC LIMIT 1
  )[OFFSET(0)]
FROM `project.dataset.table`
GROUP BY categ   

如果適用於您問題中的示例數據 - output 是

Row categ   elem     
1   1       2    
2   2       3    

暫無
暫無

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

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