如何筛选同时关联指定TAG值的相同ID记录?
筛选同时关联指定TAG值的ID
我需要从下表中筛选出至少同时关联TAG值A和B的ID(关联更多TAG值也符合要求),最终只保留满足条件的ID。
原始数据表
| ID | TAG |
|---|---|
| 1 | A |
| 2 | A |
| 1 | B |
| 2 | B |
| 3 | B |
| 2 | C |
| 3 | C |
预期输出
| ID |
|---|
| 1 |
| 2 |
可扩展的SQL查询方案
方案1:分组统计匹配TAG数量(推荐,易扩展)
这种方式只需调整IN中的TAG列表和HAVING后的数字,就能适配任意数量的指定TAG:
SELECT ID FROM your_table_name WHERE TAG IN ('A', 'B') -- 替换为目标TAG列表 GROUP BY ID HAVING COUNT(DISTINCT TAG) = 2; -- 数字对应指定TAG的总数量
若表中同一ID不会重复出现相同TAG,可去掉DISTINCT,改用COUNT(*) = 2提升查询效率。
方案2:多表连接(适合少量TAG场景)
当TAG数量不多时,可通过自连接实现,每新增一个TAG就增加一次表连接:
SELECT DISTINCT t1.ID FROM your_table_name t1 JOIN your_table_name t2 ON t1.ID = t2.ID WHERE t1.TAG = 'A' AND t2.TAG = 'B';
如需同时匹配A、B、C三个TAG,只需再JOIN一次表并添加对应TAG条件即可。
方案3:窗口函数实现(灵活扩展)
通过窗口函数统计每个ID匹配指定TAG的数量,再筛选符合条件的ID:
WITH tag_counts AS ( SELECT ID, COUNT(DISTINCT CASE WHEN TAG IN ('A', 'B') THEN TAG END) OVER (PARTITION BY ID) AS matched_tags FROM your_table_name ) SELECT DISTINCT ID FROM tag_counts WHERE matched_tags = 2; -- 对应指定TAG的总数量
内容的提问来源于stack exchange,提问作者Chris Redford
相关产品推荐
相关产品推荐

