我希望将两列(第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:
我已经尝试过从表中过滤重复项目(GROUP BY)的方法无济于事。如果不使用循环,有没有有效的方法呢?
还有一个唯一标识符列,用于索引这些值。
答案 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.