Запрос на поиск дубликатов - PullRequest
3 голосов
/ 11 января 2012

У меня есть таблица со следующей схемой:

CUSTOMERS (id INT, name VARCHAR(10), height VARCHAR(10), weight INT)

id - это первичный ключ.Я хочу выяснить, в каких строках люди, имеющие одинаковое имя, одинаковый рост и одинаковый вес.Другими словами, я хочу найти дубликаты в отношении name, height и weight.

Пример таблицы:

1, sam, 160, 100
2, ron, 167, 88
3, john, 150, 90
4, sam, 160, 100
5, rick, 158, 110
6, john, 150, 90
7, sam, 166, 110

Пример Вывод:

Теперь, поскольку есть люди с одинаковыми именами и ростоми тот же вес:

sam (id=1), sam (id=4)

и

john (id=3), john (id=6)

Я хочу получить эти идентификаторы.Также хорошо, если я получу только один id за матч (т.е. id = 1 из первого матча и id = 3 из второго матча).


Я пытаюсь выполнить этот запрос, но не уверен, что он правильный или нет.

SELECT id
FROM customers
GROUP BY name, height, weight

Ответы [ 6 ]

2 голосов
/ 11 января 2012

Попробуйте это (действительно для сервера sql):

SELECT 
    t.NAME,
    'Ids = '+
    (
        SELECT cast(Id as varchar)+',' 
        FROM Customers c 
        WHERE c.NAME = t.NAME AND c.Weight = t.Weight AND c.Height = t.Height
        FOR XML PATH('')
    )
FROM
(
    SELECT Name, height, weight
    FROM Customers
    GROUP BY Name, height, weight
    HAVING COUNT(*) > 1
) t

ИЛИ

, как вы и просили - только один Id на матч

SELECT 
    t.NAME,
    c.Id
FROM
(
    SELECT Name, height, weight
    FROM Customers
    GROUP BY Name, height, weight
    HAVING COUNT(*) > 1
) t
JOIN Customers c ON t.NAME AND c.Weight = t.Weight AND c.Height = t.Height
2 голосов
/ 11 января 2012
SELECT * 
FROM customers C
INNER JOIN 
(
  SELECT name, height, weight
  FROM customers 
  GROUP BY name, height, weight 
  HAVING COUNT(*) > 1
) X ON C.name = X.name AND C.height = X.height AND C.weight = X.weight
1 голос
/ 11 января 2012

Я не знаю, что вы используете, поскольку вы пометили несколько баз данных.

На сервере Sql вы не сможете выбрать идентификатор, не введя его в SELECT.

, поэтому, если вы хотите выбрать другие поля, кроме полей в группе, вы можете использовать PARTITION BY.Примерно так:

SELECT id,
ROW_NUMBER() OVER(PARTITION BY c.name, c.height, c.weight ORDER BY c.name) AS DuplicateCount
FROM customers c

Это даст вам идентификаторы дубликатов, которые у вас есть с тем же именем, ростом и весом.
Я не уверен, что это быстрее, чем другие решенияхотя, но вы можете профилировать и сравнивать.

1 голос
/ 11 января 2012
SELECT c.*
FROM customers c
JOIN (
    SELECT name, height, weight
    FROM 
    GROUP BY name, height, weight
    HAVING count(*) > 1
) t ON c.name = t.name and c.height = t.height and c.weight = t.weight
1 голос
/ 11 января 2012

вы на правильном пути:

SELECT min(id)
FROM customers
GROUP BY name, height, weight
HAVING COUNT(*) > 1
0 голосов
/ 11 января 2012

Если можно получить только один идентификатор на матч, как вы говорите, вы близки к решению:

SELECT 
   min( id )
  ,name, height, weight  --<-- oncly if you need/want
FROM customers
GROUP BY name, height, weight
HAVING count(*) > 1
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...