如何筛选满足指定分组求和条件的SQL表所有行?
按日期筛选符合条件的行(基于指定name的cost总和)
表结构
原表包含以下字段:
day (date) name (string) description (string) cost (float)
需求描述
选取所有行,要求满足:按day分组后,该分组中name = 'x'的cost总和大于0。
举例:若1月18日
name = 'x'的cost总和为15,则选取该日所有行(包括name != 'x'的行);若1月17日name = 'x'的cost总和为0,则不选取该日任何行。
解决方案
你提到的窗口函数思路是可行的,不需要在partition by里加where,而是通过条件聚合来实现指定name的求和,下面提供两种实用方案:
方案1:窗口函数+条件聚合
在窗口函数的sum()中用case语句过滤出name='x'的记录再求和,外层筛选总和大于0的行:
SELECT * FROM ( SELECT *, -- 只计算当前日期分组中name=x的cost总和 SUM(CASE WHEN name = 'x' THEN cost ELSE 0 END) OVER (PARTITION BY day) AS x_daily_total FROM your_table_name ) temp WHERE x_daily_total > 0;
方案2:先筛选合格日期再关联
先找出所有符合条件的日期,再关联原表获取这些日期的所有行,适合数据量较大的场景:
SELECT t.* FROM your_table_name t INNER JOIN ( -- 先筛选出name=x的cost总和>0的日期 SELECT day FROM your_table_name WHERE name = 'x' GROUP BY day HAVING SUM(cost) > 0 ) valid_days ON t.day = valid_days.day;
内容的提问来源于stack exchange,提问作者Michael
相关产品推荐
相关产品推荐

