Как найти дубликаты (правильный путь)? - PullRequest
1 голос
/ 22 мая 2019

Я использую базу данных Snowflake и выполнил этот запрос, чтобы найти общее количество, количество различных записей и разницу:

select 
    (select count(*) from mytable) as total_count, 
    (select count(*) from (select distinct * from mytable)) as distinct_count,
    (select count(*) from mytable) - (select count(*) from (select distinct * from mytable)) as duplicate_count
from mytable limit 1;

Результат:

1,759,867
1,738,924
20,943 (duplicate_count)

Но при попытке использовать другой подход (сгруппируйте ВСЕ столбцы и найдите, где число> 1):

select count(*) from (
SELECT 
    a, b, c, d, e,
    COUNT(*)
FROM 
    mytable
GROUP BY 
    a, b, c, d, e
HAVING 
    COUNT(*) > 1
)

Я получаю 5,436.

Почему существует разница в количестве дубликатов? (20,943 против 5,436)

Спасибо.

1 Ответ

2 голосов
/ 22 мая 2019

Хорошо. Давайте начнем с одного простого примера:

create table #test
(a int, b int, c int, d int, e int)

insert into #test values (1,2,3,4,5)
insert into #test values (1,2,3,4,5)
insert into #test values (1,2,3,4,5)
insert into #test values (1,2,3,4,5)
insert into #test values (1,2,3,4,5)
insert into #test values (5,4,3,2,1)
insert into #test values (5,4,3,2,1)
insert into #test values (1,1,1,1,1)

И попробуйте свой подзапрос, чтобы понять, что вы получите:

SELECT 
    a, b, c, d, e,
    COUNT(*)
FROM 
    #test
GROUP BY 
    a, b, c, d, e
HAVING 
    COUNT(*) > 1

Подумай немного ...

Данг Данг Данг Данг ~

a   b   c   d   e   (No column name)
1   2   3   4   5   5
5   4   3   2   1   2

Он вернет только две строки, потому что вы использовали 'group by'. Но он по-прежнему считал повторяющиеся числа для каждой комбинации a, b, c, d, e.

Если вы хотите общее количество дубликатов, попробуйте это:

select sum(sub_count) from (
SELECT 
    a, b, c, d, e,
    COUNT(*) - 1 as sub_count
FROM 
    #test
GROUP BY 
    a, b, c, d, e
HAVING 
    COUNT(*) > 1)a

В этом случае вам нужно поставить минус один, если я правильно понимаю ваши исходные запросы. Поправь меня, если я ошибаюсь.

...