T-SQL在忽略某些列的同时消除重复行

时间:2013-06-28 01:34:19

标签: sql sql-server tsql duplicates

我很难找到合适的语句来选择仅为特定列重复的非重复条目。例如,在下表中我只关心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语句来实现这一点,或者在比较重复行时指定要忽略的某些列?

1 个答案:

答案 0 :(得分: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()函数只为每行指定一个数字,在此示例中,您希望保留col1col2col3的每个组合,因此您{{1} }它们,意味着对于它们的每个组合,编号将从1开始。您可以只运行内部查询来获得想法。

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

GROUP BY

此处的缺点是SELECT col1, col2, col3, MAX(col4), MAX(col5) FROM table GROUP BY col1, col2, col3 MAX()的{​​{1}}可能来自不同的行,因此您不一定要从原始表中返回一行,但如果您不关心你返回哪一行然后无所谓。