繁体   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