我有一个包含3列的表格,如下例所示。
所有行都有一个唯一的productid,但customerid和productname重复。我只希望将每个重复项的1条记录选择到具有所有3列的新表中。因此,从下面的行中,我希望将第1行和第3行插入新表。
productid(guid) customerid productname
4362C96D-B413-EA11-A811-000D3A25C7C2 12345678910 credit
C7EC397D-04BF-E611-80EE-005056A027F8 12345678910 credit
F796026C-B413-EA11-A811-000D3A25C942 24681012141 leasing
7490976F-B413-EA11-A811-000D3A25C7C6 24681012141 leasing
我使用此SQL将所有重复的行选择到新表中:
SELECT p.productid, p2.customerid, p2.productname
INTO tempTable
FROM products AS p
JOIN (SELECT customerid, productname
FROM products
GROUP BY customerid, productname
HAVING COUNT(productname)>1) AS p2
ON p.customerid = p2.customerid AND p.productname= p2.productname
ORDER BY p.customerid, p.productname
此SQL在没有productid的情况下有效,但是如果我添加唯一的pr行的productid,则找不到重复的SQL。
SELECT customerid, productname
FROM testtable
GROUP BY customerid, productname
HAVING COUNT(productname) > 1
ORDER BY customerid
| 12345678910 | credit |
| 24681012141 | leasing |
如何查询此数据以在每个重复行中仅选择1个?
答案 0 :(得分:0)
您可以在结果集中添加ROW_NUMBER()
窗口函数,以区分GUID值。
SELECT
productid,
customerid,
productname
INTO tempTable
SELECT
productid,
customerid,
productname
FROM
(
SELECT
productid,
customerid,
productname,
ROW_NUMBER() OVER (PARTITION BY customerid, productname ORDER BY productid) AS rn
FROM testtable
) AS d
WHERE d.rn = 1
答案 1 :(得分:0)
CREATE TABLE MyTable (productid varchar(255),customerid bigint, productname varchar(50)) INSERT INTO MyTable (productid,customerid,productname) VALUES ('4362C96D-B413-EA11-A811-000D3A25C7C2',12345678910,'credit'), ('C7EC397D-04BF-E611-80EE-005056A027F8',12345678910,'credit'), ('F796026C-B413-EA11-A811-000D3A25C942',24681012141,'leasing'), ('7490976F-B413-EA11-A811-000D3A25C7C6',24681012141,'leasing')
WITH CTE AS ( SELECT productid, customerid, productname, ROW_NUMBER() OVER (PARTITION BY customerid, productname ORDER BY productid) AS rn FROM MyTable ) SELECT customerid, productname FROM CTE WHERE rn =1 GO
customerid | productname ----------: | :---------- 12345678910 | credit 24681012141 | leasing
SELECT customerid, productname FROM MyTable GROUP BY customerid, productname HAVING COUNT(*) > 1 ORDER BY customerid GO
customerid | productname ----------: | :---------- 12345678910 | credit 24681012141 | leasing
db <>提琴here