从两列中选择非不同的行

Posted

技术标签:

【中文标题】从两列中选择非不同的行【英文标题】:Select non distinct rows from two columns 【发布时间】:2013-07-22 23:49:40 【问题描述】:

我的问题与Multiple NOT distinct 非常相似,只是它处理多列而不是一列。我有一张这样的桌子:

A B C
1 1 0
1 2 1
2 1 2
2 1 3
2 2 4
2 3 5
2 3 6
3 1 7
3 3 8
3 1 9

结果应该是:

A B C
2 1 2
2 1 3
2 3 5
2 3 6
3 1 7
3 1 9

基本上,就像上面的问题一样,只有在唯一性由两列而不是一列确定的情况下,才删除所有唯一条目。我已经尝试了对上述答案的各种调整,但都无法正常工作。

【问题讨论】:

【参考方案1】:

您使用的是 SQL Server,所以这比在 Access 中更容易:

select A, B, C
from (select t.*, count(*) over (partition by A, B) as cnt
      from t
     ) t
where cnt > 1;

count(*) 的这种使用是作为一个窗口函数。它正在计算具有相同 AB 值的行数。最后的where 只选择具有多个条目的行。

【讨论】:

像魅力一样工作!谢谢!对 OVER 和 PARTITION BY 语句的作用有任何说明吗? @1215drew-NWR-。 . .这些用于窗口函数,非常有用。数据库文档很好地涵盖了这些(至少 SQL Server 和 Oracle)。它们是标准的一部分并且随时可用(例如 SQL Server、Oracle、Postgres、DB2)。我知道我在“使用 SQL 和 Excel 进行数据分析”一书中介绍了它们。基本 SQL 书籍通常不涉及此主题。 谢谢,我会深入研究一下文档,也许看看你的书。【参考方案2】:

EXISTS 的另一种可能解决方案

SELECT a, b, c 
  FROM Table1 t
 WHERE EXISTS 
(
  SELECT 1 
    FROM Table1
   WHERE a =  t.a 
     AND b =  t.b
     AND c <> t.c
)

应该够快了。

输出:

|一个 |乙| C | ------------- | 2 | 1 | 2 | | 2 | 1 | 3 | | 2 | 3 | 5 | | 2 | 3 | 6 | | 3 | 1 | 7 | | 3 | 1 | 9 |

这里是SQLFiddle演示

【讨论】:

以上是关于从两列中选择非不同的行的主要内容,如果未能解决你的问题,请参考以下文章

尝试从两列中提取多条记录时,精确提取返回的行数超过了请求的行数

MYSQL:从两列中选择最高的ID并排序

如何删除R中两列中具有相同值但ID不同的行[重复]

SQL查询从两列中检索两个日期之间的数据

从 SQLITE 中的两列中选择不同的值

sql查询以选择两列中具有相同id但不同值的记录