Нулевая дата исполнения - PullRequest
2 голосов
/ 03 июня 2019

Я ищу строки, которые совпадают, и у меня возникла проблема, когда поле даты рождения null.

В настоящее время у меня есть два сценария, которые могут идентифицировать три вида одинаковости, которые я ищу, но я бы хотел сделать это с одним.

Да, данные могут быть обновлены для использования известной даты, которая может означать ноль, но я не хочу менять данные или копировать в новую таблицу.

Мне удалось создать один скрипт, который выполняет всю работу, но на его запуск уходит ужасное количество времени. Я смог сделать это только благодаря этому ответу . Оба сценария выполняются менее чем за секунду, в то время как один сценарий занимает 26 минут.

Сценарий 1, который соответствует нулевым датам рождения, но пропускает имена одинаковые

SELECT last_name, birthdate, count(distinct first_name) 
FROM merged_person 
    having count(distinct first_name) >1 
GROUP BY last_name, birthdate 
ORDER BY last_name;

Сценарий 2, который пропускает нулевые даты рождения

SELECT *
FROM merged_person
WHERE (last_name, birthdate) IN
    (SELECT last_name, birthdate
    FROM merged_person
    GROUP BY last_name, birthdate
    HAVING COUNT(*) > 1
    )
ORDER BY last_name, birthdate;

Сценарий 3 варианта, который находит все результаты, но занимает слишком много времени.
Вариант 1

SELECT *
FROM merged_person
WHERE (last_name, nvl(birthdate, '0001-01-01')) IN
    (SELECT last_name, nvl(birthdate, '0001-01-01')
    FROM merged_person
    GROUP BY last_name, birthdate
    HAVING COUNT(*) > 1
    )
ORDER BY last_name, birthdate;

вариант 2

SELECT *
FROM merged_person
WHERE (last_name, nvl(to_char(birthdate, 'DD-MM-YYYY'), '00-00-0000')) IN
    (SELECT last_name, nvl(to_char(birthdate, 'DD-MM-YYYY'), '00-00-0000')
    FROM merged_person
    GROUP BY last_name, birthdate
    HAVING COUNT(*) > 1
    )
ORDER BY last_name, birthdate;

Использование nvl(birthdate, '0001-01-01') не смог отловить все случаи.

Есть ли способ улучшить производительность или другой способ совпадения нулевых дат рождения?

Edit:

Одинаковыми являются записи, которые имеют одинаковую фамилию и дату рождения, остальные поля не важны для сопоставления, но это имя, номер файла, идентификатор сотрудника, пол, набор информации о найме.

Поскольку я работаю с производственными данными, я не могу показать ни одной возвращенной строки.

Примеры * +1036 *

  • Брюс Бэннер, 1966 года рождения, Эмпид 1234, мужчина
  • Сара Баннер, 1966 года рождения, Эмпид 1345, женщина
  • Энн Райс, Нуль, Эмпид 1134, женщина
  • Бен Райс, Нуль, Эмпид 1153, мужчина

Определение баннера легко. Это рис, который вызывает проблемы.

Ответы [ 2 ]

2 голосов
/ 04 июня 2019

Аналитические функции позволяют избежать проблем с самостоятельными объединениями и преобразованиями типов:

- Люди с одинаковой фамилией и датой рождения.выберите имя, фамилию, дату рождения из (

--All rows, with a count of people with same last name and birth date.
select first_name, last_name, birthdate,
    count(*) over (partition by last_name, birthdate) duplicate_count
from merged_person

), где duplicate_count> = 2 порядка по имени, фамилии, дате рождения;


Исходная проблема началась с классической проблемы NULL:NULL не равен NULL, но NULL также не равен NULL.Это сбивает с толку и займет некоторое время, чтобы понять, но это имеет смысл, если вы считаете NULL «отсутствием значения».

Использование NVL для избежания проблем с NULL - хорошая идея, нонеявное преобразование типов могло вызвать проблемы.Было бы чище использовать дату даты ISO 8601.Вы уже используете правильный формат, просто поставьте перед ним ключевое слово DATE.

Измените:

nvl(birthdate, '0001-01-01')

На:

nvl(birthdate, date '0001-01-01')
0 голосов
/ 04 июня 2019
  1. Если целью является получение строк с одинаковыми фамилией и датой рождения, исключите строки с NULL в столбце даты рождения из запроса.
  2. Если эта таблица огромного размера, я бы не советовал использовать операторы IS NULL или IS NOT NULL.Однако, если у вас есть какой-либо флаг с Y / N (присутствует или нет), вы можете использовать этот флаг для фильтрации записей без даты рождения.
  3. Но IS NULL или IS NOT NULL - единственныйспособ выбрать строки в вашем случае.Использование функций уровня строки в предложении SELECT будет иметь некоторые накладные расходы, но не в целом, как при использовании их в LHS предложения WHERE, и в этом отношении используется IS NULL и IS NOT NULL.
  4. Кроме того, я не вижуПредложение WHERE в вашем операторе SQL.Насколько большой этот стол?Являются ли столбцы SELECT частью индекса в качестве ведущих столбцов в некотором индексе?
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...