Подсчет повторяющихся записей без учета значений NULL - PullRequest
0 голосов
/ 15 января 2020

Пример данных:

+---------+---------+---------+---------+
| COLUMN1 | COLUMN2 | COLUMN3 | COLUMN4 |
+---------+---------+---------+---------+
| A       | B       | C       | null    |
+---------+---------+---------+---------+
| A       | B       | C       | D       |
+---------+---------+---------+---------+
| X       | Y       | null    | Z       |
+---------+---------+---------+---------+
| X       | Y       | Q       | Z       |
+---------+---------+---------+---------+

Ожидаемый результат: 2

Объяснение:

Мне нужно сосчитать уникальные записи в приведенном выше, и определение этого в этом случае заключается в том, что ВСЕ заполненные значения в записи должны быть одинаковыми, НО, если одна запись имеет заполненное значение, а другая имеет значение NULL в том же самом столбец, он должен рассматриваться как один и тот же.

Таким образом, в приведенном выше примере счет будет равен 2, поскольку для записи 1 и 2 все заполненные столбцы одинаковы, а в столбце 4 D должен сравниваться с NULL как равный , У кого-нибудь есть предложения, как это сделать?

Ответы [ 3 ]

1 голос
/ 15 января 2020

У меня была та же проблема с двумя разными таблицами. Я использовал внутреннее соединение и проверил, является ли table1.col1 нулевым, затем используйте table2.col1

Например: выберите ISNULL (table1.Col1, table2.Col1) из таблицы1 полное внешнее объединение table2 ...... и так далее

В случае одной и той же таблицы вы можете применить соединение с другим псевдонимом

Проверьте, работает ли оно в вашем случае

1 голос
/ 15 января 2020

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

select count(*)
from mytable t1
where not exists (select 1
                  from mytable t2 
                  where t2.id < t1.id and
                        (t2.column1 = t1.column1 or t1.column1 is null or t2.column1 is null) and
                        (t2.column2 = t1.column2 or t1.column2 is null or t2.column2 is null) and
                        (t2.column3 = t1.column3 or t1.column3 is null or t2.column3 is null) and
                        (t2.column4 = t1.column4 or t1.column4 is null or t2.column4 is null) 
                 );

Здесь - это дб <> скрипка.

1 голос
/ 15 января 2020

Предполагая, что ваша таблица имеет первичный ключ с именем id, вы можете сделать это с помощью exists и агрегации

select count(*) result
from mytable t
where exists (
    select 1 from mytable t1 
    where 
        t1.id <> t.id 
        and t1.column1 = t.column1
        and t1.column2 = t.column2
        and t1.column3 = t.column3
        and (t1.column4 is null or t.column4 is null or t1.column4 = t.column4)
)

Демонстрация на DB Fiddle :

| result |
| -----: |
|      2 |
...