如何复制没有重复值的列? SQL

时间:2016-02-12 17:39:55

标签: sql database tsql

我希望将两列(第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

我想只插入INTO:

  • UserID 101项目1 w / date
  • UserID 101第2项w / date
  • UserID 101项目3 w / date
  • UserID 102第5项w / date
  • UserID 102第6项w / date
  • UserID 103第1项w / date
  • UserID 103第4项w / date

我已经尝试过从表中过滤重复项目(GROUP BY)的方法无济于事。如果不使用循环,有没有有效的方法呢?

还有一个唯一标识符列,用于索引这些值。

4 个答案:

答案 0 :(得分:2)

只需执行GROUP BY UserId, Item并使用HAVING来确定群体人数:

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

这将仅向表B中插入非重复的UserId, Item对。

如果您想插入所有 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,下一条记录具有row nummber = 2等。INSERT操作使用此行号值,以便从每个UserID分区中仅选择一条记录。

答案 1 :(得分:1)

插入不存在的非重复项目:

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)

答案 2 :(得分:1)

尝试

and

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

答案 3 :(得分:0)

INSERT INTO TableB (Col1, Col2) select UserId,item from TableA group by UserId,item

Only this much gave me the desired output. Isn't it what you want.