2009-11-25 4 views
3

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

У меня есть таблица говорят, называется [Kpi] и данные будут выглядеть так: -

[ContractId] [KpiId]  [NotificationIntervalInMonths] 
1000   1    3 
1000   2    5 

У меня есть [Договор] таблица, которая содержит: -

[ContractId] [StartDate]  [EndDate] 
1000   1/Nov/2009  4/Apr/2011 

я после способ показать расписание уведомлений о том, когда Kpi должен уведомить пользователя между датой начала и окончания контракта, например Вышеупомянутая структура создаст следующие столбцы/строки: -

[ContractId] [KpiId]  [NotificationDate] 
    1000   1   1/Feb/2009 
    1000   1   1/May/2010 
    1000   1   1/Aug/2010 
    1000   1   1/Nov/2010 
    1000   1   1/Feb/2011 
    1000   2   1/Apr/2010 
    1000   2   1/Sep/2010 
    1000   2   1/Feb/2011 

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

Моя бизнес-логика не позволяет изменить [NotificationIntervalInMonths], однако [EndDate] контракта может измениться. Это означает, что мне придется добавлять/удалять записи в таблице поиска на основе нового контракта [EndDate], и ​​для меня это кажется немного беспорядочным.

Так что это приводит меня к моему вопросу, есть ли чистый подход SQL, который может получить мне расписание уведомлений без создания таблицы поиска? Курсоры не допускаются: P, но я надеюсь, что CTE будет работать здесь.

Если я не дал достаточно информации, тогда, пожалуйста, спросите.

+0

У меня есть решение, которое основано на рекурсивном КТР. Однако этот CTE работает только в том случае, если мой интервал уведомлений для каждого Kpi кратен 3. Это нормально для меня, поскольку оно существует, потому что моя бизнес-логика имеет это ограничение. Однако было бы неплохо решить это, если бы мой интервал был настроен на что угодно (для будущей проверки), поэтому, если кто-то может помочь, тогда это будет здорово. Я могу опубликовать свое решение, если захочет какой-либо орган. – Rippo

+0

Решила его наконец, может обслуживать любой промежуток времени. – Rippo

ответ

1

Это ответ, если какой-либо орган мог бы рассмотреть его/улучшить его, пожалуйста, дайте мне знать ...

declare @startDate datetime, @endDate datetime 
set @startDate = '01/Nov/2009' 
set @endDate = '04/Apr/2011' 

declare @kpi table(kpiid int, interval int) 
insert into @kpi 
select 1, 3 
union select 2, 5 
--union select 3, 9 
--union select 4, 12 

;with mycte(i, d, interval, p, kpiid) as 
(
select i = 1, [email protected], Interval, 0, kpiid from @kpi 
union all 
select 
    i = i + 1, 
    dateAdd(mm, i, @StartDate), 
    interval, 
    case when (datediff(mm, @StartDate, m.d)) % interval = (interval - 1) then 1 else 0 end, 
    m.kpiid 
from 
    mycte m where m.d < @EndDate 
) 
select * from mycte where p = 1 and d <[email protected] order by kpiid, d 
1

Создайте функцию с таблицей, которая принимает ваши два диапазона дат и которая вернет 1-ю дату каждого месяца в этом диапазоне. Затем присоединитесь к этой функции в запросе. Извините, не могу дать более подробную информацию, кто-то беспокоит меня в Skype (о, это вы!). :)

+0

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

+1

Нет, нет, я создам некоторый SQL. Хотя поиск по календарю будет быстрее (и вы можете включить такие вещи, как «избегать декабря, поскольку это большая выпивка»). –

+0

+1 за то, что я улыбаюсь! – Rippo

Смежные вопросы