基于单个不同列选择唯一行

Posted

技术标签:

【中文标题】基于单个不同列选择唯一行【英文标题】:select unique rows based on single distinct column 【发布时间】:2012-01-06 14:55:42 【问题描述】:

我想选择具有distinct email 的行,请参见下面的示例表:

+----+---------+-------------------+-------------+
| id | title   | email             | commentname |
+----+---------+-------------------+-------------+
|  3 | test    | rob@hotmail.com   | rob         |
|  4 | i agree | rob@hotmail.com   | rob         |
|  5 | its ok  | rob@hotmail.com   | rob         |
|  6 | hey     | rob@hotmail.com   | rob         |
|  7 | nice!   | simon@hotmail.com | simon       |
|  8 | yeah    | john@hotmail.com  | john        |
+----+---------+-------------------+-------------+

期望的结果是:

+----+-------+-------------------+-------------+
| id | title | email             | commentname |
+----+-------+-------------------+-------------+
|  3 | test  | rob@hotmail.com   | rob         |
|  7 | nice! | simon@hotmail.com | simon       |
|  8 | yeah  | john@hotmail.com  | john        |
+----+-------+-------------------+-------------+

我不在乎返回哪个 id 列值。 所需的 SQL 是什么?

【问题讨论】:

【参考方案1】:

如果您使用的是MySql 5.7 或更高版本,根据这些链接(mysql Official、SO QA),我们可以在每个group by 中选择一条记录,而无需任何聚合函数.

所以查询可以简化成这样。

select * from comments_table group by commentname;

在行动中试用查询here

【讨论】:

不幸的是,这个问题被标记为 tsql 和 sqlserver。 尽管这是对错误问题的正确答案,但我最终还是在这里为 mysql 寻找这个解决方案,所以带上我的 updoot 好的解决方案值得更多尊重【参考方案2】:

TSQL 中的快速操作

SELECT a.*
FROM emails a
INNER JOIN 
  (SELECT email,
    MIN(id) as id
  FROM emails 
  GROUP BY email 
) AS b
  ON a.email = b.email 
  AND a.id = b.id;

【讨论】:

哇,伙计们太快了!:) 笔记本电脑的答案是最短和最简单的,谢谢! 这里不需要distinct 关键字。此外,似乎只加入 id 也可以解决问题。 我有一个巨大的表,主键是两列的聚合,在这种情况下它不起作用 @downvoter ,不工作是什么意思,也许是另一个问题? 太好了,我将最小值更改为最大值以获取副本中的最后一行而不是第一行【参考方案3】:

由于您不在乎返回哪个 id,我坚持为每封电子邮件使用 MAX id 以简化 SQL 查询,请尝试一下

;WITH ue(id)
 AS
 (
   SELECT MAX(id)
   FROM table
   GROUP BY email
 )
 SELECT * FROM table t
 INNER JOIN ue ON ue.id = t.id

【讨论】:

【参考方案4】:

我假设您的意思是您不关心用于获取 titleidcommentname 值的行(您对所有行都有“rob”,但我不关心'不知道这是否真的会在您的数据模型中强制执行)。如果是这样,那么您可以使用窗口函数返回给定电子邮件地址的第一行:

select
    id,
    title,
    email,
    commentname

from
(
select 
    *, 
    row_number() over (partition by email order by id) as RowNbr 

from YourTable
) source

where RowNbr = 1

【讨论】:

这是最好的解决方案,因为它可以应用于没有唯一标识列的重复行,或者具有唯一标识列的行。 ....是的,这为我解决了这个问题....上面的解决方案只将表数据分组在一起......即用于 Microsoft SQL 2008 Server/data...... ....谢谢亚当...... 这是一个非常好的解决方案,适用于较小的表。有没有办法做到这一点,而不必在 SELECT 语句中列出每一列?

以上是关于基于单个不同列选择唯一行的主要内容,如果未能解决你的问题,请参考以下文章

在 Access 中有多个列的查询中选择单个不同的列

SAP HANA SQL - 将单个列的多个结果行合并为单个行

遍历 pyspark 数据框中的列,而不为单个列创建不同的数据框

检索行之间特定列不同的行

以编程方式查找,更正具有不同列和行长度的数据帧中的ID

MySQL必知必会---检索数据