SQL查询:筛选昨日带x标签今日带y标签的商家
筛选连续两日标签变化的商家SQL方案
假设合并后的临时表名为temp_tags,包含字段merchant(商家名)、date(日期)、tag(标签),以下几种方法都能满足需求:
方法1:自连接(直观易读)
通过将表与自身连接,匹配同一商家的两日标签记录:
SELECT DISTINCT t1.merchant FROM temp_tags t1 JOIN temp_tags t2 ON t1.merchant = t2.merchant WHERE t1.date = '2023-02-09' AND t1.tag = 'x' AND t2.date = '2023-02-10' AND t2.tag = 'y';
- 用
DISTINCT避免同一商家因重复记录导致的结果重复 - 如果日期字段含时间戳,需用
DATE(t1.date)提取纯日期部分,比如DATE(t1.date) = '2023-02-09'
方法2:分组聚合(适合批量验证多条件)
先过滤目标日期的数据,再按商家分组,通过聚合函数验证两日标签都存在:
SELECT merchant FROM temp_tags WHERE date IN ('2023-02-09', '2023-02-10') GROUP BY merchant HAVING SUM(CASE WHEN date = '2023-02-09' AND tag = 'x' THEN 1 ELSE 0 END) > 0 AND SUM(CASE WHEN date = '2023-02-10' AND tag = 'y' THEN 1 ELSE 0 END) > 0;
- 这种方式可以轻松扩展,比如增加更多日期或标签的验证条件
方法3:窗口函数(灵活处理日期序列)
用LAG窗口函数获取同一商家前一日的标签,直接筛选符合变化条件的记录:
WITH merchant_daily_tags AS ( SELECT merchant, date, tag, LAG(tag) OVER (PARTITION BY merchant ORDER BY date) AS previous_day_tag FROM temp_tags WHERE date BETWEEN '2023-02-09' AND '2023-02-10' ) SELECT DISTINCT merchant FROM merchant_daily_tags WHERE date = '2023-02-10' AND tag = 'y' AND previous_day_tag = 'x';
- 适合需要处理连续多日标签变化的场景,只需调整日期范围即可
内容的提问来源于stack exchange,提问作者Kyle
相关产品推荐
相关产品推荐

