如何在Snowflake SQL中筛选状态始终为'low'的user_id
Snowflake SQL筛选状态始终为'low'的user_id解决方案
以下是几种可行的实现方式,根据你的具体需求选择:
1. 基于全局起止月份筛选
如果需要确保用户在整个数据集的起止月份范围内,所有记录的状态都是low,且每个月份都有记录(可选):
WITH date_range AS ( SELECT MIN(month) AS start_month, MAX(month) AS end_month FROM your_table ) SELECT user_id FROM your_table CROSS JOIN date_range WHERE month BETWEEN start_month AND end_month GROUP BY user_id HAVING MIN(status) = 'low' AND MAX(status) = 'low' -- 若需强制每个月份都有该用户的记录,打开下面的注释 -- AND COUNT(DISTINCT month) = (SELECT DATEDIFF(MONTH, start_month, end_month) + 1 FROM date_range)
2. 基于用户自身的起止月份筛选
如果要筛选每个用户在自己有记录的时间段内,所有状态均为low:
WITH user_month_info AS ( SELECT user_id, MIN(month) AS user_start_month, MAX(month) AS user_end_month FROM your_table GROUP BY user_id ) SELECT t.user_id FROM your_table t JOIN user_month_info u ON t.user_id = u.user_id WHERE t.month BETWEEN u.user_start_month AND u.user_end_month GROUP BY t.user_id HAVING MIN(t.status) = 'low' AND MAX(t.status) = 'low'
3. 排除法筛选
通过排除存在非low状态的用户来快速得到结果,适用于指定固定起止月份的场景:
SELECT DISTINCT user_id FROM your_table WHERE month BETWEEN '2023-01-01' AND '2023-12-01' -- 替换为实际起止月份 AND user_id NOT IN ( SELECT user_id FROM your_table WHERE month BETWEEN '2023-01-01' AND '2023-12-01' AND status != 'low' )
注意事项
- 将
your_table替换为你的实际表名 - 若
month字段是具体日期,可使用DATE_TRUNC('MONTH', date_column)转换为月份粒度的日期值 - 若不需要强制用户在每个月份都有记录,可去掉对应代码行
内容的提问来源于stack exchange,提问作者rien312
相关产品推荐
相关产品推荐

