4

我正在努力寻找合适的语句来选择仅对特定列重复的非重复条目。例如,在下表中,我只关心在 col1、col2 和 col3 中具有唯一值的行,而 col4 和 col5 中的值无关紧要。这意味着我会认为第 1 行和第 2 行是重复的,第 4 行和第 5 行是重复的:

col1 col2 col3 col4 col5
 A    2    p    0    2
 A    2    p    1    8
 A    3    r    4    12
 B    0    f    3    1
 B    0    f    6    5

我只想选择以下内容:

col1 col2 col3 col4 col5
 A    2    p    0    2
 A    3    r    4    12
 B    0    f    3    1

有没有办法组合多个 DISTINCT 语句来实现这一点,或者在比较重复行时指定要忽略的某些列?

4

1 回答 1

2

您必须选择要保留的行,您可以使用以下ROW_NUMBER()功能:

SELECT col1, col2, col3, col4, col5
FROM (SELECT *, ROW_NUMBER() OVER(PARTITION BY col1, col2, col3 ORDER BY col4 DESC) 'RowRank'
      FROM table
     )sub 
WHERE RowRank = 1

您可以更改ORDER BY部分以更改保留的行和折腾的行。该ROW_NUMBER()函数只是为每一行分配一个数字,在此示例中,您希望保留 , , 的每个组合,col1因此您可以保留它们,这意味着它们的每个组合的编号将从 1 开始。您可以只运行内部查询来了解这个想法。col2col3PARTITION BY

或者,您可以使用GROUP BY和聚合函数,即:

SELECT col1, col2, col3, MAX(col4), MAX(col5)
FROM table
GROUP BY col1, col2, col3

这里的缺点是MAX()ofcol4col5可能来自不同的行,因此您不一定要从原始表中返回一行,但是如果您不在乎返回哪一行,那也没关系。

于 2013-06-28T01:37:46.660 回答