【问题标题】:Finding duplicates, but including duplicates and other columns in results查找重复项,但在结果中包括重复项和其他列
【发布时间】:2017-02-17 23:16:45
【问题描述】:

我想在我的表中的两个不同列上查找重复项,但也希望在结果中包含其他列值。比如行id。我正在使用 SQL SERVER 2012

这是我目前所拥有的:

SELECT rowID, appID, spNumber, spName, date_submitted 
FROM myTable
GROUP BY appID
HAVING COUNT(*) > 1

上述查询的问题在于它将所有重复项分组为一行。我希望显示所有重复项。我还想找到 appID 和 spNumber 字段的所有重复项。这就是我希望结果数据的样子。我只想显示 APPID 和 SPNUMBER 都重复的行。

rowID   |   appID  |  spNumber  |  spName  |  date_submitted
-------------------------------------------------------------
  34    |    832   |     1      | Bob Smith|   01/01/2010
  36    |    832   |     1      | Joe Bob  |   05/01/2010
  54    |    901   |     2      | Sue Joe  |   03/01/2010
  57    |    901   |     2      | Pat Joh  |   04/01/2010
  59    |    901   |     2      | Tim Sue  |   03/01/2010
  64    |    951   |     1      | Jim Bob  |   06/01/2010
  67    |    951   |     1      | Sam Sue  |   09/01/2010

【问题讨论】:

  • 此查询不会在 SQL Server 上运行,您使用的是 MySQL 吗?

标签: sql sql-server


【解决方案1】:

ROW_NUMBER() 将为您执行此操作。只需确保选择行号高于 1 的行,您只会根据 PARTITION BY 中的两列获得重复项

例子:

SELECT rowID, appID, spNumber, spName, date_submitted 
FROM (
    SELECT t.*, ROW_NUMBER() OVER (PARTITION BY appID, spNumber ORDER BY appID) AS rn
    FROM myTable t
) x
WHERE rn > 1

【讨论】:

    【解决方案2】:

    那就是

    SELECT rowID, appID, spNumber, spName, date_submitted 
    FROM myTable
    JOIN (
        SELECT appID
        FROM myTable
        GROUP BY appID, spNumber
        HAVING COUNT(*) > 1
    ) dups ON myTable.appID = dups.appID AND dups.spNumber = myTable.spNumber
    

    【讨论】:

    • 这不起作用。它没有给我 appID 和 spNumber 的行
    • 啊,我正在那里进行您的示例,但没有读到它适用于两者。这种调整很容易,我已经对其进行了编辑以显示。
    • 另外,你用的是mysql吗?我以为当我的第一个回复在这里时,它被标记为 mysql,但正如其他人提到的那样,它现在没有被标记为这样。标签 sql-server 用于 Microsoft 的 SQL Server。
    【解决方案3】:

    如果您的 DBMS 支持窗口聚合,这很简单:

    with cte as 
     (
       SELECT rowID, appID, spNumber, spName, date_submitted,
          count(*) over (partition by appID) as cnt -- count per appID
       FROM myTable
       GROUP BY appID
     )
    SELECT  rowID, appID, spNumber, spName, date_submitted
    FROM cte
    WHERE cnt > 1
    

    【讨论】:

      猜你喜欢
      • 2012-10-31
      • 1970-01-01
      • 2013-02-21
      • 1970-01-01
      • 1970-01-01
      • 2019-01-15
      • 1970-01-01
      • 2013-10-03
      • 1970-01-01
      相关资源
      最近更新 更多