Соединение влево двух таблиц на основе диапазона дат - PullRequest
0 голосов
/ 05 июня 2019

Я новичок в кодировании SQL и пытаюсь выяснить, как создать оператор LEFT JOIN на основе диапазона дат.База данных представляет собой аналитику из приложения для смартфона, которое отправляет сообщения пользователям.Две таблицы - это messageLog (который описывает сообщения, отправленные каждому пользователю) и messageOpenLog (который описывает открытые сообщения).Обе таблицы связаны с таблицей сообщений, но не связаны друг с другом.Чтобы усложнить ситуацию, есть пара других правил, которые мы разработали, когда сообщения могут быть отправлены:

  1. Если сообщение не открывается в течение 7 дней, оно может быть повторно отправлено в день 8.
  2. Если сообщение открыто, то сообщение может быть повторно отправлено в течение 60 дней.

Итак, я хочу объединить две таблицы на основе следующего псевдокода (поскольку я понятия не имею, с чего начать с реального кода):

LEFT JOIN 
If (messageOpenLog.DateOpened is within 7 days of messageLog.DateSent) 
and messageLog.message_id = messageOpenLog.message_id and 
messageLog.user_id = messageOpenLog.user_id

Примечание: формат даты - гггг-мм-дд чч: мм: сс в обеих таблицах.

Любая помощьВы можете предоставить, будет принята с благодарностью.

Ответы [ 3 ]

1 голос
/ 05 июня 2019

Я не могу прокомментировать ответ shn, но есть вероятность, что пользователь никогда не открывал сообщение и запись messageOpenLog не была создана. В этом случае вы можете добавить messageOpenLog.message_id is null к предложению where и получить эти неоткрытые сообщения без соответствующей записи messageOpenLog.

0 голосов
/ 05 июня 2019

Я бы предложил:

messagelog  ml LEFT JOIN
messageOpenLog mol
ON mol.message_id = ml.message_id AND
   mol.user_id = ml.user_id AND
   mol.DateOpened >= ml.DateSent AND  -- probably not needed
   mol.DateOpened < ml.DateSent + interval '7 day'

Обратите внимание, что арифметика дат сильно различается в разных базах данных. Точный синтаксис для добавления семи дней может немного отличаться в вашей базе данных.

0 голосов
/ 05 июня 2019

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

Чтобы сделать разницу во времени, я бы рекомендовал использовать функцию DATEDIFF () , встроенную в SQL (вам может понадобиться отформатировать метки времени в формате даты с помощью DATE ()).

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

SELECT 
   messageOpenLog.*, 
   messageLog.* 
FROM 
   messageLog LEFT JOIN messageOpenLog ON messageLog.message_id=messageOpenLog.message_id 
WHERE
   messageLog.user_id = messageOpenLog.user_id AND
   DATEDIFF(
      day, 
      DATE(messageLog.timestamp), 
      DATE(messageOpenLog.timestamp)
   ) > 7

Структура этого запроса зависит от структуры ваших таблиц. Обратите внимание, что я использовал столбец .timestamp, но в ваших таблицах он может называться по-разному.
Также я не уверен, действительно ли это то, что вы хотите; если вы хотите увидеть, если сообщение старше 7 дней, требуется другой запрос.

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

Очень сложно дать вам точный запрос на основе представленной информации, такой как потенциальное количество строк с одинаковым message_id, как упоминает @amac, могут также быть случаи, когда в одной из таблиц нет строк с определенным message_id.

...