选择重复项

时间:2020-05-26 19:24:21

标签: sql sql-server tsql

我有一个包含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个?

2 个答案:

答案 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