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

如何标记table_a中与table_b匹配组的最低ID首次出现记录

刚好碰到过类似的需求,我给你两种实用的SQL实现方案,适配MySQL、PostgreSQL、SQL Server这些主流数据库:

方案一:窗口函数实现(推荐,性能更优)

这种方式利用窗口函数快速分组取每组的最小ID,再结合关联验证,代码简洁高效:

SELECT 
    a.Id,
    a.Customer,
    a.Users,
    CASE 
        -- 判断是否是当前(Customer, Users)组的首次记录(ID最小)
        WHEN MIN(a.Id) OVER (PARTITION BY a.Customer, a.Users) = a.Id 
             -- 同时验证该(Customer, Users)存在于table_b中
             AND EXISTS (SELECT 1 FROM table_b b WHERE b.Customer = a.Customer AND b.Users = a.Users)
        THEN 1  -- 符合条件标记为1,也可以改成'Yes'之类的文本
        ELSE 0 
    END AS include
FROM table_a a;
方案二:子查询实现(兼容老版本数据库)

如果你的数据库不支持窗口函数(比如非常老的MySQL版本),可以用子查询的方式:

SELECT 
    a.Id,
    a.Customer,
    a.Users,
    CASE 
        -- 子查询获取当前组的最小ID,判断是否为当前记录
        WHEN a.Id = (SELECT MIN(Id) FROM table_a WHERE Customer = a.Customer AND Users = a.Users)
             -- 验证是否在table_b的匹配列表里
             AND (a.Customer, a.Users) IN (SELECT Customer, Users FROM table_b)
        THEN 1 
        ELSE 0 
    END AS include
FROM table_a a;

运行结果示例

执行任意一种方案后,都会得到你期望的结果:

IdCustomerUsersinclude
1001001abc1
1011001abc0
1021001xyz0
1031001xyz0
1041002abc0
1051002abc0
1061002xyz1
1071002xyz0

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 08:43:10