如何标记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;
运行结果示例
执行任意一种方案后,都会得到你期望的结果:
| Id | Customer | Users | include |
|---|---|---|---|
| 100 | 1001 | abc | 1 |
| 101 | 1001 | abc | 0 |
| 102 | 1001 | xyz | 0 |
| 103 | 1001 | xyz | 0 |
| 104 | 1002 | abc | 0 |
| 105 | 1002 | abc | 0 |
| 106 | 1002 | xyz | 1 |
| 107 | 1002 | xyz | 0 |
内容的提问来源于stack exchange,提问作者user2523167
相关产品推荐
相关产品推荐

