T-SQL消除重复行并忽略特定列

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列和第5列中的内容。如果你真的不需要它们,从SELECT DISTINCT字段列表中省略它们即可完成工作。 - Justin Crabtree
我需要在输出中保留第4列和第5列,所以不幸的是不能从DISTINCT字段中省略它们。 - user2530187
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()可能来自不同的行,因此您不一定会返回原始表中的单个行,但如果您不关心返回哪一行,则无关紧要。

我修改了您的初始解决方案,只使用嵌套SELECT: SELECT * FROM (SELECT DISTINCT(col1) AS unique_col1, col2, col 3 FROM table) ORDER BY unique_col1;这对我来说似乎可以工作。这足够吗?还是省略PARTITION会导致意想不到的问题? - user2530187
如果你只想返回col1、col2和col3,你可以直接使用以下语句: SELECT DISTINCT col1,col2,col3 FROM table 使用ROW_NUMBER()的目的是基于这三个值返回完整的行。 - Hart CO
此外,GROUP BY 解决方案确实可行;一个问题——第4列和第5列将始终是递增的时间戳,因此我认为它总是会返回相同的行?(后面的那个?) - user2530187
Sub只是子查询的别名,SQL Server要求这样做。是的,MAX()总是获取最新日期,MIN()获取最早日期。 - Hart CO

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接