Выбрать дубликаты - PullRequest
1 голос
/ 26 мая 2020

У меня есть таблица с 3 столбцами, как в примере ниже.

Все строки имеют уникальный идентификатор продукта, но есть дубликаты идентификатора клиента и имени продукта вместе. Я хочу выбрать только 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, но не найдет дубликатов, если я добавлю productid, который является уникальной строкой pr.

SELECT customerid, productname 
FROM testtable 
GROUP BY customerid, productname
HAVING COUNT(productname) > 1
ORDER BY customerid

| 12345678910 | credit |
| 24681012141 | leasing |

Как я могу запросить эти данные, чтобы выбрать только 1 из каждой повторяющейся строки?

Ответы [ 2 ]

1 голос
/ 26 мая 2020
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 <> fiddle здесь

0 голосов
/ 26 мая 2020

Вы можете добавить оконную функцию ROW_NUMBER() в свой набор результатов, чтобы различать guish между значениями 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
...