Как объединить две таблицы по дате? MYSQL

0

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

У меня две таблицы:

t1 table: company_id, expected_checkdate

t2 table: company_id, actual_checkdate
  • Условие 1: acutal_checkdate = expected_checkdate
  • Условие 2: acutal_checkdate в течение 10 дней с момента ожидания_checkdate
  • Условие 3: expected_checkdate в течение 10 дней после acutal_checkdate
  • Утверждение 4: если acutal_checkdate = expected_checkdate, то не проверяйте других, которые находятся в течение 10 дней

      LEFT OUTER JOIN t2 ON t1.actual_checkdate = t2.expected_checkdate
           OR t1.actual_checkdate 
           BETWEEN DATE_ADD(t2.expected_checkdate, INTERVAL -10 DAY) 
             AND DATE_ADD(t2.expected_checkdate, INTERVAL 10 DAY)
           AND t1.company_id = t2.company_id
    

Проблема в том, что я запускаю это в течение одного месяца. Я вижу много дубликатов, потому что за один месяц может быть 2 записи actual_checkdate или 2 expected_checkdate.

      |---------------------|------------------|------------------|
      |     company_id      | actual_checkdate |expected_checkdate|
      |---------------------|------------------|------------------|
      |          12         |    2018-01-05    |    2018-01-05    |
      |---------------------|------------------|------------------|
      |          12         |    2018-01-19    |    2018-01-19    |
      |---------------------|------------------|------------------|
      |          12         |    2018-01-05    |    2018-01-19    | -- incorrect 
      |---------------------|------------------|------------------|
      |          12         |    2018-01-19    |    2018-01-05    | -- incorrect 
      |---------------------|------------------|------------------|
      |          13         |    2018-01-12    |    2018-01-20    | 
      |---------------------|------------------|------------------|
      |          14         |    2018-01-26    |    2018-01-36    | 
      |---------------------|------------------|------------------|

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

  • 0
    Здравствуй. Вы не описываете и не пишете код для нужной таблицы. Дайте условие, при котором строка находится в результате, в терминах ее столбцов. «присоединиться к таблицам, чтобы найти, если ...» не ясно или точно. Также обратите внимание, что это происходит в стиле, который перефразирует код, что может быть хорошо, но это не тот стиль формулировки, который я только что предложил. PS Пожалуйста, прочитайте и действуйте на минимальном воспроизводимом примере .
  • 0
    @philipxy Я отредактировал сообщение. Это верно?
Показать ещё 2 комментария
Теги:
duplicates
intervals
left-join
dateadd

1 ответ

0
Лучший ответ

Вы можете переписать условие JOIN следующим образом:

FROM t1
JOIN t2 ON t1.company_id = t2.company_id AND
   (t1.actual_checkdate = t2.expected_checkdate OR
    t1.actual_checkdate BETWEEN 
       DATE_SUB(t2.expected_checkdate, INTERVAL 10 DAY) 
       AND DATE_ADD(t2.expected_checkdate, INTERVAL 10 DAY)
    AND NOT EXISTS (SELECT * FROM t1 WHERE t1.actual_checkdate = t2.expected_checkdate AND t1.company_id = t2.company_id)
 )

Предложение NOT EXISTS предотвратит совпадение на близлежащей дате, если существует фактическое совпадение.

  • 0
    Включает ли интервал t1.actual_checkdate = t2.expected_checkdate?
  • 0
    Да, именно поэтому у меня есть предложение NOT EXISTS, чтобы предотвратить совпадение интервалов, когда уже есть точное совпадение. Из-за предложения NOT EXISTS вы не можете использовать интервал для проверки на точное совпадение, поэтому проверка на точное совпадение также есть в предложении WHERE.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню