Почему я получаю дополнительные строки в LEFT JOIN при соединении со столбцом ID и TIMESTAMP? - PullRequest
1 голос
/ 24 октября 2019

У меня есть таблица, которая содержит несколько периодов регистрации (дата и время начала регистрации, а также дата и время окончания этого экземпляра регистрации). Для каждой строки (периода регистрации) существует столбец состояния, который содержит состояние в конце периода регистрации. Я пытался получить статус, связанный с самой последней датой окончания регистрации для данного идентификатора. Я использовал оконную функцию, чтобы получить самую последнюю конечную дату интереса для каждого идентификатора, а затем я захотел ВЛЕВО СОЕДИНИТЬСЯ по идентификатору и конечной дате, чтобы получить статус из той же таблицы, в которой я использовал оконную функцию. На самом деле должна быть только одна комбинация для данной конечной даты и статуса для каждого идентификатора, но каким-то образом я получаю больше строк, чем в левой таблице.

Как я уже упоминал ранее, мой подход заключался в использовании окнафункция для получения MAX(end_date) для идентификатора и некоторого другого столбца, назовем его enrollment_number. Затем используйте LEFT JOIN для этой таблицы и ее родительской таблицы, чтобы получить статус, связанный только с этой датой. Позже я хотел бы использовать результат этого объединения, чтобы внести статус, связанный с датой окончания, в другие таблицы, где мне это нужно.

WITH
     my_first_test AS
     (
    SELECT my_id,
           enrollment_number,
           MAX(end_date_of_enrollment) OVER (partition by my_id, enrollment_number) AS end_date_enrolled
    FROM enrollments
     )

SELECT mft.my_id, mft.end_date_enrolled, e.status
FROM my_first_test AS mft
LEFT JOIN enrollments AS e
                  ON mft.my_id = e.my_id AND mft.end_date_enrolled = e.end_date_enrolled;

CTE возвращает 42917 строк, такое же количество строккак в таблице enrollments, которая должна быть, если я правильно ее понимаю.

Затем я ОСТАЮСЬ СОЕДИНЯТЬСЯ enrollments, чтобы получить информацию из столбца status, также содержащегося в enrollmentsТаблица. LEFT JOIN выполняется на my_id и end_date_enrolled.

Я ожидаю 42917 строк в итоговой таблице, потому что my_id и end_date_enrolled вместе должны быть уникальными. Однако в моей финальной таблице я получил немного больше строк - 44408. Мне было интересно, сможет ли сообщество StackOverflow помочь мне разгадать эту загадку. Я использую SQL в AWS Redshift.

1 Ответ

1 голос
/ 24 октября 2019

У вас есть дубликаты в enrollments. Вы можете найти их с агрегацией:

SELECT my_id, end_date_enrolled, COUNT(*)
FROM enrollments AS e
GROUP BY my_id, end_date_enrolled
HAVING COUNT(*) > 1;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...