2016-04-13 3 views
1

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

В таблице конфигурации содержит:

  • типа события Идентификатор (template_internal_id)
  • номер напоминания
  • напоминание порога (количество дней, прошедших от события для отправки напоминания с помощью)
  • напоминания сообщение

configuration table

Вторая таблица содержит список событий и должна совпадать с напоминанием о количестве дней, прошедших со времени события. Теперь, если бы я знал, что на самом деле количество возможных порогов, это выглядело бы что-то вроде этого

select template_internal_id, create_date, 
DATEDIFF (DAY, msg_rfi.create_date, GETDATE()) as event_age 
from events 
left join configuration 
on events.template_internal_id=configuration.template_internal_id 
and event_age>first_threshold and event_age<second_threshold 

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

Буду признателен за ваши рекомендации.

Спасибо!

+0

добавьте структуру событий таблицы и некоторые выборочные данные в нем. неясно, что вы имеете в виду, рассматривая эти случаи. Например, скажем, прошло 2 дня, а event.template_internal_id - 9001. Что вы ожидаете вернуть в запросе? каков должен быть результат, если один и тот же запрос запускается через 3 дня? –

ответ

0

Вы знаете, что первые три порога всегда будут использоваться, поэтому вы можете использовать их безоговорочно. В этом примере я буду использовать < для всех сравнений, но вам нужно будет отрегулировать его для ваших нужд.

ON ... AND event_age < first AND event_age < second AND event_age < third 

На данный момент, четвертые и пятые пороги не являются обязательными:

ON ... AND ... event_age < third AND (fourth IS NULL OR event_age < fourth) AND (fifth IS NULL OR event_age < fifth) 

Таким образом, пороговые значения используются только тогда, когда они заполнены. Если он заселен на всех, то замените ___ IS NULL на template_id <> ___.

+0

Возможно, я не объяснил себя правильно. Это всегда будет один порог, и только это. Соответствующий порог может быть либо от первого до пятидесятого, но диапазон, по которому они определены, является динамическим. –

0

Вы можете использовать подзапрос, чтобы получить remainder_num (я предполагаю, что вы используете его для последовательности выполнения), получив минимальный идентификатор, который не прошел deadline. После того, что remainder_num, ваш главный запрос становится простым:

SELECT e.template_internal_id, e.create_date, 
    DATEDIFF(DAY, e.create_date, GETDATE()) AS event_age 
FROM events e 
LEFT JOIN configuration c 
ON e.template_internal_id = c.template_internal_id 
WHERE remainder_num = (
    SELECT MIN(remainder_num) FROM configuration c 
    WHERE c.template_internal_id = e.template_internal_id 
    AND c.deadline > DATEDIFF(DAY, e.create_date, GETDATE()) 
) 
Смежные вопросы