【问题标题】:How to copy a column without duplicate values? SQL如何复制没有重复值的列? SQL
【发布时间】:2016-02-12 17:39:55
【问题描述】:

我希望将两列(第 1 列、第 2 列和第 3 列)的值复制到另一个表;但是,如果第 2 列中有重复值,我不希望复制值。示例如下:

UserID     Item    Date
------------------------
101        1   <  2-10-2016
101        1   <  2-9-2016
101        2      2-11-2016
101        3      2-11-2016
102        5      2-11-2016
102        6      2-14-2016
103        1      2-11-2016
103        4   <  2-11-2016
103        4   <  2-11-2016

我只想插入:

  • 用户 ID 101 项目 1 带日期
  • 用户 ID 101 项目 2 带日期
  • 用户 ID 101 项目 3 带日期
  • 用户 ID 102 项目 5 带日期
  • 用户 ID 102 项目 6 带日期
  • 用户 ID 103 项目 1 带日期
  • 用户 ID 103 项目 4 带日期

我尝试找到一种方法来过滤表中的重复项 (GROUP BY),但无济于事。有没有不使用循环的有效方法?

还有一个唯一标识符列为这些值编制索引。

【问题讨论】:

    标签: sql database tsql


    【解决方案1】:

    只需做一个GROUP BY UserId, Item 并使用HAVING 来确定群体人口:

    INSERT INTO TableB (Col1, Col2)
    SELECT  UserId, Item
    FROM TableA
    GROUP BY UserId, Item
    HAVING COUNT(*) = 1
    

    这只会将不重复的UserId, Item 对插入到 TableB 中。

    如果您想插入 all UserId, Item只插入一次,请使用:

    INSERT INTO TableB (Col1, Col2)
    SELECT  UserId, Item
    FROM TableA
    GROUP BY UserId, Item
    

    如果您有其他字段,请尝试以下操作:

    ;WITH ToBeInserted AS (
      SELECT UserID, Item, [Date], 
             ROW_NUMBER() OVER (PARTITION BY UserID 
                                ORDER BY [Date] DESC) AS rn  
      FROM TableA
    )
    INSERT INTO TableB (UserID, Item, [Date])
    SELECT UserID, Item, [Date]
    FROM ToBeInserted
    WHERE rn = 1
    

    ROW_NUMBER窗口函数用于枚举属于同一UserID分区的记录:具有最近[Date]值的记录的行号等于1,下一条记录的行号= 2等.INSERT 操作使用此行号值以便从每个UserID 分区中仅选择一条记录。

    【讨论】:

    • 这非常有帮助!如果您的第三列只是需要复制的附加信息怎么办?关于第 1 列和第 2 列的逻辑仍然适用。我试过运行 GROUP BY UserId, Item 但如果您需要移动另一列,这将不起作用。请参阅原始问题。
    【解决方案2】:

    插入不存在的非重复项:

    INSERT INTO TableB (Col1, Col2)
      SELECT T.UserId, T.Item
      FROM (
        SELECT  UserId, Item
        FROM TableA
        GROUP BY UserId, Item
      ) T
      WHERE (T.UserId, T.Item) NOT IN 
        (SELECT UserId, Item FROM TableB)
    

    【讨论】:

      【解决方案3】:

      试试

      INSERT INTO TableB (Col1, Col2)
      SELECT  UserId, Item, Max([Date])
      FROM TableA
          GROUP BY UserId, Item
      

      如果要插入最小的日期,请使用 Min()。

      【讨论】:

        【解决方案4】:

        插入表 B (Col1, Col2) 从 TableA 中选择 UserId,item 按 UserId,item 分组

        只有这么多给了我想要的输出。这不正是你想要的吗?

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2019-11-28
          相关资源
          最近更新 更多