SQL:如何为一列中具有重复值的每组行选择一行?

Posted

技术标签:

【中文标题】SQL:如何为一列中具有重复值的每组行选择一行?【英文标题】:SQL: how to pick one row for each set of rows with duplicate value in one column? 【发布时间】:2018-11-27 06:49:51 【问题描述】:

我有一个如下所示的表格:

Player | Sport | Rank
A        Tennis  1
B        Tennis  2
C        Tennis  2
D        Tennis  2
E        Tennis  3
F        Soccer  1
G        Soccer  2

等等。

对于每个 Sport 相同的分区,我想过滤结果,以便每个 Sport 的每个 Rank 都是唯一的。在我上面的示例中,结果中将选择 B/C/D 之一,我不在乎选择了哪一个。

我希望结果是(其中 D 也可以是 B 或 C):

Player | Sport | Rank
A        Tennis  1
D        Tennis  2
E        Tennis  3
F        Soccer  1
G        Soccer  2

如何在 SQL 中实现这个逻辑?

【问题讨论】:

@kzs 请检查我的答案。 【参考方案1】:

一个好的老式 GROUP BY 应该这样做:

SELECT MIN(player) AS any_player, sport, rank
FROM t
GROUP BY sport, rank

【讨论】:

【参考方案2】:

你可以使用ROW_NUMBER:

Select player, sport,rank
FROM
(select player, sport,rank,
ROW_NUMBER() OVER(partition by sport,rank order by player) as rown
FROM table
)a
WHERE a.rown=1;

【讨论】:

以上是关于SQL:如何为一列中具有重复值的每组行选择一行?的主要内容,如果未能解决你的问题,请参考以下文章

SQL选择一列中具有重复值的所有行

如何为熊猫数据框的每一列应用具有不同时间常数的一阶过滤器?

SQL 选择以消除在下一列中具有 2 个其他值的重复值

Hive - 如何获取每组值的分位数

如何为 T-SQL 选择中的每一行生成一个随机数?

如何为熊猫数据框中的每一行映射/替换列中的多个值