[英]SQL: how can I exclude certain lines from an aggregated result?
在我構建的查詢中,結果顯示如下:
SELECT name
,ARRAY_AGG(fruits ORDER BY time ASC) AS all_fruits
FROM table_fruits
姓名 | all_fruits |
---|---|
人甲 | 蘋果,香蕉,蘋果,蘋果,蘋果,蘋果 |
乙人 | 蘋果,蘋果,蘋果,香蕉,蘋果,香蕉 |
C人 | 香蕉,香蕉,蘋果,香蕉,蘋果,蘋果 |
我想再添加一列顯示蘋果的數量。 但是,我不想數蘋果之后是香蕉。 因此,附加列應如下所示。
姓名 | all_fruits | count_of_apple |
---|---|---|
人甲 | 蘋果,香蕉,蘋果,蘋果,蘋果,蘋果 | 4 |
乙人 | 蘋果,蘋果,蘋果,香蕉,蘋果,香蕉 | 2 |
C人 | 香蕉,香蕉,蘋果,香蕉,蘋果,蘋果 | 2 |
我將如何在 SQL 中執行此操作? 來源包括食用水果的時間。
您可以檢查:
LEAD
窗口函數該行后面的“水果”值是什么COALESCE
函數將用當前的“ fruits ”值替換這個 NULL 值"Apple"
並且您的下一個值不是"Banana"
時,您可以在CASE
語句中為新列分配 1SELECT *,
CASE WHEN fruits = 'Apple'
AND COALESCE(LEAD(fruits) OVER(
PARTITION BY name
ORDER BY time),
fruits) <> 'Banana'
THEN 1
END AS apples_not_after_bananas
FROM table_fruits
在這一步之后,您可以使用自己的代碼並添加
GROUP BY
子句,用於聚合“名稱”字段SUM
聚合函數在先前生成的1
秒內。WITH cte AS (
SELECT *,
CASE WHEN fruits = 'Apple'
AND COALESCE(LEAD(fruits) OVER(
PARTITION BY name
ORDER BY time),
fruits) <> 'Banana'
THEN 1
END AS apples_not_after_bananas
FROM table_fruits
)
SELECT name,
ARRAY_AGG(fruits ORDER BY time ASC) AS all_fruits,
SUM(apples_not_after_bananas) AS count_of_apple
FROM cte
GROUP BY name
在此處查看演示。
編輯:香蕉在 1 天后才來
如果要添加此特定條件或一般任何條件,則需要在 CASE 語句中工作,該語句當前有兩個條件,一個針對當前水果,一個針對下一個水果。
檢查香蕉是否在 1 天后到達只是意味着添加如下內容:
CASE WHEN fruits = 'Apple'
AND COALESCE(LEAD(fruits) OVER(
PARTITION BY name
ORDER BY time),
fruits) <> 'Banana'
--AND <if difference between the current next time value is greater than 1 day>
THEN 1
END AS apples_not_after_bananas
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.