You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.11 22:41:14