【问题标题】:T-SQL Eliminating duplicate rows while ignoring certain columnsT-SQL 在忽略某些列的同时消除重复行
【发布时间】:2013-06-25 16:59:09
【问题描述】:

我正在努力寻找合适的语句来选择不重复的条目,仅针对特定列。例如,在下表中,我只关心在 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 字段列表中省略它们即可完成工作
  • 我需要在输出中保留第 4 列和第 5 列,所以很遗憾不能从 DISTINCT 字段中省略它们。

标签: sql sql-server tsql duplicates


【解决方案1】:

您必须选择要保留的行,您可以为此使用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 导致意外问题?
  • 好吧,如果你只想返回 col1,col2,col3,你可以使用:SELECT DISTINCT col1,col2,col3 FROM table 使用 ROW_NUMBER() 的目的是能够根据 3 个值返回完整的行.
  • 另外,GROUP BY 解决方案确实有效;一个问题——第 4 列和第 5 列将始终是递增顺序的时间戳,所以我实际上认为它总是会返回同一行? (后一个?)
  • Sub 只是子查询的别名,sql server 需要它。是的,MAX() 将始终获取最新日期,MIN() 最早。
猜你喜欢
  • 2011-01-23
  • 2022-12-07
  • 2017-09-18
  • 1970-01-01
  • 2020-08-02
  • 1970-01-01
  • 2023-02-04
  • 1970-01-01
  • 2021-04-17
相关资源
最近更新 更多