我很难找到合适的语句来选择仅为特定列重复的非重复条目。例如,在下表中我只关心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语句来实现这一点,或者在比较重复行时指定要忽略的某些列?
答案 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()
函数只为每行指定一个数字,在此示例中,您希望保留col1
,col2
,col3
的每个组合,因此您{{1} }它们,意味着对于它们的每个组合,编号将从1开始。您可以只运行内部查询来获得想法。
或者,您可以使用PARTITION BY
和聚合函数,即:
GROUP BY
此处的缺点是SELECT col1, col2, col3, MAX(col4), MAX(col5)
FROM table
GROUP BY col1, col2, col3
和MAX()
的{{1}}可能来自不同的行,因此您不一定要从原始表中返回一行,但如果您不关心你返回哪一行然后无所谓。