簡體   English   中英

SQL:如何從聚合結果中排除某些行?

[英]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窗口函數該行后面的“水果”值是什么
  • 如果檢查的行是最后一行,它將沒有下一個值(它將為 NULL),因此COALESCE函數將用當前的“ fruits ”值替換這個 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子句,用於聚合“名稱”字段
  • 當蘋果后面沒有香蕉時, 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.

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