[英]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.