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

查询满足近3个月2种颜色及此前独特色条件的人员ID

满足双条件的人员查询SQL实现

筛选规则

需同时符合以下两个要求:

  • 近3个月的记录中,该人员至少有2种不同的颜色
  • 3个月之前的记录中,该人员存在至少1种独特色(独特色定义:该颜色未出现在该人员近3个月的颜色记录中)

示例参考

示例表数据

IDPersonIDColorDate
11'black''2021-10-25'
21'black''2021-09-25'
32'green''2021-09-25'
42'yello''2021-08-25'
52'red''2021-07-01'
61'black''2021-07-01'

预期输出

PersonID
2

结果说明

PersonID=2符合要求:近3个月有绿色、黄色2种不同颜色,3个月前的红色未在近3个月记录中出现,属于独特色。PersonID=1近3个月只有黑色1种颜色,不满足第一个筛选条件,因此被排除。

实现代码(MySQL语法)

-- 定义表名:person_color,可根据实际表名修改
WITH recent_color_info AS (
    -- 统计每个用户近3个月的颜色数量、颜色集合
    SELECT
        PersonID,
        COUNT(DISTINCT Color) AS distinct_recent_color_num,
        GROUP_CONCAT(DISTINCT Color) AS recent_color_list
    FROM person_color
    -- 实际使用可将'2021-10-25'替换为CURDATE()取当前日期计算
    WHERE Date >= DATE_SUB('2021-10-25', INTERVAL 3 MONTH)
    GROUP BY PersonID
),
old_color_info AS (
    -- 提取每个用户3个月前的所有非重复颜色
    SELECT DISTINCT
        PersonID,
        Color AS old_color
    FROM person_color
    WHERE Date < DATE_SUB('2021-10-25', INTERVAL 3 MONTH)
)
SELECT DISTINCT o.PersonID
FROM old_color_info o
INNER JOIN recent_color_info r
    ON o.PersonID = r.PersonID
WHERE
    -- 满足条件1:近3个月至少2种不同颜色
    r.distinct_recent_color_num >= 2
    -- 满足条件2:存在3个月前的独特色
    AND FIND_IN_SET(o.old_color, r.recent_color_list) = 0;

如果你使用其他数据库,只需替换对应字符串拼接、字符串查找函数即可:

  • PostgreSQL:将GROUP_CONCAT替换为STRING_AGG(Color, ','),FIND_IN_SET替换为POSITION(o.old_color IN r.recent_color_list) = 0
  • SQL Server:将GROUP_CONCAT替换为STRING_AGG(Color, ','),FIND_IN_SET替换为CHARINDEX(o.old_color, r.recent_color_list) = 0

内容的提问来源于stack exchange,提问作者Maor k

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 12:45:04