提问人:Mohit S 提问时间:11/7/2023 最后编辑:Tim LewisMohit S 更新时间:11/7/2023 访问量:54
如何在 SQL 中仅选择 UNIQUE 行
How to Select only UNIQUE rows in SQL
问:
我有一个表格,如下图所示
| C1 | C2 | C3 | C4 |
r1 | a | b | c | 1 |
r2 | a | b | c | 2 |
r3 | c | s | d | 3 |
r4 | c | w | w | 4 |
r5 | c | r | w | 5 |
在这里,如果我们连接 C1、C2 和 C3 列,我们会看到 r1 和 r2 行具有相同的值(C4 不同)。我想选择,以便删除 r1 和 r2,只选择 r3、r4 和 r5。
Distinct 不起作用,因为 C4 是唯一的,并且“分组依据”将保留其中一行。
我想要如下输出
| C1 | C2 | C3 | C4 |
r3 | c | s | d | 3 |
r4 | c | w | w | 4 |
r5 | c | r | w | 5 |
答:
0赞
Lajos Arpad
11/7/2023
#1
只需使用并过滤组,即可通过以下方式:group by
count
having
select C1, C2, C3, min(C4) as C4
from yourtable
group by C1, C2, C3
having count(*) = 1
评论
3赞
Akina
11/7/2023
分组不完整。可能会失败。添加任何聚合函数(例如,ANY_VALUE)。
1赞
Lajos Arpad
11/7/2023
@Akina它不应该使AFAIK失败,因为我们只选择单个元素的组,并过滤掉规则会失败的任何组。但我没有测试这个,我可能是错的。编辑了答案以使其防弹
2赞
Akina
11/7/2023
您添加 MIN() - 现在一切都正确了。如果没有此功能,如果启用了ONLY_FULL_GROUP_BY模式,则查询将失败,这是版本 8+ 的默认设置
0赞
Mohit S
11/8/2023
非常感谢你们俩。代码按照要求完美运行。祝你今天开心!!
0赞
Lajos Arpad
11/8/2023
@MohitS很乐意提供帮助。
1赞
The Impaler
11/7/2023
#2
您可以执行以下操作:
select c1, c2, c3 from (
select t.*, count(*) over(partition by c1, c2, c3) as c from t
) x where c = 1
结果:
c1 c2 c3
--- --- --
c r w
c s d
c w w
请参阅 db<>fiddle 中的运行示例。
上一个:按每个日期的最后注册进行分组
评论
select * from (select t.*, count(*) over(partition by c1, c2, c3) as c from t) x where c = 1
?