【问题标题】: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

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

【问题讨论】:

    标签: sql sql-server database


    【解决方案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演示

    【讨论】:

      猜你喜欢
      • 2017-11-11
      • 1970-01-01
      • 1970-01-01
      • 2021-03-30
      • 2016-05-14
      • 1970-01-01
      • 2017-05-06
      • 2020-01-03
      • 2013-07-15
      相关资源
      最近更新 更多