[英]How to aggregate data for logic and show non-aggregated results in the output?
我有一張如下所示的表格:
人 | 水果 | 日期 |
---|---|---|
一個 | 蘋果 | xxxx |
乙 | 香蕉 | xxxx |
C | 蘋果 | xxxx |
一個 | 香蕉 | xxxx |
C | 蘋果 | xxxx |
乙 | 香蕉 | xxxx |
我對數據集中擁有不止一根香蕉的人感興趣。 在這種情況下,將是 B 人。我了解如何通過聚合數據來實現這一點。 但是,如果我希望我的結果不被聚合並且看起來像下面這樣,那么最好的方法是什么?
人 | 水果 | 日期 |
---|---|---|
乙 | 香蕉 | xxxx |
乙 | 香蕉 | xxxx |
您可以通過在子查詢中使用窗口函數(在本例中使用count_if
聚合函數)並過濾結果來實現此目的:
-- sample data
WITH dataset(person, fruit, date) AS (
VALUES ('A', 'apple' ,'xxxx'),
('B', 'banana' ,'xxxx'),
('C', 'apple' ,'xxxx'),
('A', 'banana' ,'xxxx'),
('C', 'apple' ,'xxxx'),
('B', 'banana' ,'xxxx')
)
-- query
select person, fruit, date
from (select *,
count_if(fruit = 'banana') over(partition by person) banana_count
from dataset)
where banana_count > 1
輸出:
人 | 水果 | 日期 |
---|---|---|
乙 | 香蕉 | xxxx |
乙 | 香蕉 | xxxx |
您可以使用諸如SUM() OVER ()
之類的窗口函數以及條件聚合:
SELECT person, fruit, date
FROM (SELECT SUM(CASE
WHEN fruit = 'banana' THEN
1
END) OVER( PARTITION BY person ) AS cnt
FROM t) tt
WHERE cnt > 1
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.