如何筛选c_id列仅出现一次的数据?SQL语句问题求助
原始数据表格
| id | c_id | number |
|---|---|---|
| 3444 | 34 | 3377752 |
| 3446 | 35 | 3473747 |
| 3447 | 35 | 3532061 |
| 3454 | 37 | 3379243 |
| 3455 | 38 | 3464467 |
| 3456 | 38 | 3377493 |
期望结果表格
| id | c_id | number |
|---|---|---|
| 3444 | 34 | 3377752 |
| 3454 | 37 | 3379243 |
问题分析
你当前的SQL语句存在两个核心问题:
GROUP BY c_id, number会将同一c_id但不同number的行拆分为独立分组,每个分组的计数自然为1,完全起不到筛选c_id仅出现一次的作用。- 语句中
COUNT(cart_id)是笔误,你的数据表中不存在cart_id字段,应该使用COUNT(*)或COUNT(c_id)。
解决方案
方案1:子查询筛选唯一c_id后关联原表
先统计每个c_id的出现次数,筛选出仅出现1次的c_id,再关联原表获取完整行数据:
SELECT t.id, t.c_id, t.number FROM your_table t JOIN ( SELECT c_id FROM your_table GROUP BY c_id HAVING COUNT(*) = 1 ) AS unique_cids ON t.c_id = unique_cids.c_id;
方案2:窗口函数(更简洁)
使用窗口函数COUNT() OVER (PARTITION BY c_id)计算每个c_id的全局出现次数,直接筛选次数为1的行:
SELECT id, c_id, number FROM ( SELECT id, c_id, number, COUNT(*) OVER (PARTITION BY c_id) AS c_id_count FROM your_table ) AS sub WHERE c_id_count = 1;
内容的提问来源于stack exchange,提问作者ali razzazi
相关产品推荐
相关产品推荐

