【问题标题】:Return only unique rows from a Table仅返回表中的唯一行
【发布时间】:2016-09-03 09:33:41
【问题描述】:

我有一个 4 列 7 行的表格。

此表包含 1 个具有相同 ID 的客户,即 LNAMEFNAME

此外,该表还有 2 个 ID 相同的客户,但 LNAMEFNAME 不同。

那是销售代表输入错误。理想情况下,我的表应该只有 2 行(ID_pk 为 3 和 7 的行)

我需要上表中的以下结果集:

  1. 所有唯一行按所有四列(ID_pk 为 3 和 7 的行)。 (不包括下面列出的第 3 种情况

  2. 所有四列的所有重复项ID_pk 为 3 和 8 的行)。

  3. 所有由 Customer_ID 重复但 LNAME 和/或 FNAME 不匹配的重复项(ID_pk 为 1、2、4 和 5 的行)这些行必须发送回销售代表进行验证。)

【问题讨论】:

    标签: sql sql-server duplicates not-exists


    【解决方案1】:

    您可以使用 CTE(公用表表达式):https://msdn.microsoft.com/en-us/library/ms175972.aspx

    ;WITH checkDup AS (
            SELECT Customer_ID, ROW_NUMBER() OVER (PARTITION BY Customer_ID ORDER BY Customer ID) AS 'RN'
            FROM Table)
            SELECT Customer_ID FROM checkDup
            WHERE RN = 1;
    

    将为您提供示例输出。

    您可以操纵 CTE 以获得您寻求的其他结果。

    【讨论】:

      【解决方案2】:

      这样的事情在很大程度上依赖于嵌套查询、GROUP BY 子句和 COUNT 函数。

      第 1 部分 - 唯一行

      此查询将显示客户 ID 具有匹配数据的所有行。

      SELECT Customer_ID, Customer_FNAME, Customer_LNAME FROM dbo.customers WHERE Customer_ID IN (
          SELECT Customer_ID FROM (
              SELECT DISTINCT Customer_ID, Customer_FNAME, Customer_LNAME FROM dbo.customers
              GROUP BY Customer_ID, Customer_FNAME, Customer_LNAME
          ) Customers
          GROUP BY Customer_ID
          HAVING COUNT(Customer_ID) = 1
      )
      GROUP BY Customer_ID, Customer_FNAME, Customer_LNAME
      

      第 2 部分 - 重复

      此查询将显示多次输入相同数据的所有行。

      SELECT Customer_ID, Customer_FNAME, Customer_LNAME
      FROM dbo.customers
      GROUP BY Customer_ID, Customer_FNAME, Customer_LNAME
      HAVING COUNT(Customer_ID) > 1
      

      第 3 部分 - 不匹配的数据

      这个查询与第一个基本相同,只是寻找不同的 COUNT 值。

      SELECT Customer_ID, Customer_FNAME, Customer_LNAME FROM dbo.customers WHERE Customer_ID IN (
          SELECT Customer_ID FROM (
              SELECT DISTINCT Customer_ID, Customer_FNAME, Customer_LNAME FROM dbo.customers
              GROUP BY Customer_ID, Customer_FNAME, Customer_LNAME
          ) Customers
          GROUP BY Customer_ID
          HAVING COUNT(Customer_ID) > 1
      )
      GROUP BY Customer_ID, Customer_FNAME, Customer_LNAME
      

      【讨论】:

      • 非常感谢菲利普。我正在使用 Count、Group By、IN、Not Exists 和嵌套子查询,但序列偏离了轨道!
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-11-06
      • 1970-01-01
      • 2021-12-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多