在我構建的查詢中,結果顯示如下:
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 中執行此操作?來源包括食用水果的時間。
uj5u.com熱心網友回復:
您可以檢查:
- 對于父表中的每一行,帶有視窗函式的行后面的“水果”值
LEAD - 如果檢查的行是最后一行,它將沒有下一個值(它將為 NULL),因此該函式將用當前的“ fruits ”值
COALESCE替換這個 NULL值 - 因此,當當前的“ fruits ”值是
"Apple"而您的下一個值不是"Banana"時,您可以在CASE陳述句中將 1 分配給新列
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
在這一步之后,您可以使用自己的代碼并添加
- 您錯過的
GROUP BY子句,匯總到“名稱”欄位 - 當蘋果后面沒有香蕉時,先前生成的 s的
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
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/491571.html
標籤:sql PostgreSQL 逻辑 聚合函数
上一篇:在字串中查找數字記錄號
下一篇:DEFAULT約束是實際約束嗎?
