首页 文章

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

提问于
浏览
3

我正在努力找到适当的语句来选择仅对特定列重复的非重复条目 . 例如,在下表中我只关心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 回答

  • 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 的每个组合,因此它们是 PARTITION BY ,这意味着对于它们的每个组合,编号将从1开始 . 您可以只运行内部查询来获取想法 .

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

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

    这里的缺点是 col4col5MAX() 可能来自不同的行,所以你关心你返回哪一行然后无所谓 .

相关问题