如何在 SQL 中仅选择 UNIQUE 行

How to Select only UNIQUE rows in SQL

提问人:Mohit S 提问时间:11/7/2023 最后编辑:Tim LewisMohit S 更新时间:11/7/2023 访问量:54

问:

我有一个表格,如下图所示

   | 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  |
SQL MySQL 选择 非重复

评论

0赞 The Impaler 11/7/2023
select * from (select t.*, count(*) over(partition by c1, c2, c3) as c from t) x where c = 1?

答:

0赞 Lajos Arpad 11/7/2023 #1

只需使用并过滤组,即可通过以下方式:group bycounthaving

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 中的运行示例。