我有3张桌子。
1)任务,范围和优先级。
CREATE TABLE taskPriorities (
[taskCommand] [varchar](max) NOT NULL,
[taskStartDate] [int] NOT NULL,
[taskEndDate] [int] NOT NULL,
[taskPriority] [int] NOT NULL)
2)执行任务日志
CREATE TABLE taskLog (
[id] [int] IDENTITY(1,1) NOT NULL,
[jobId] [int] NOT NULL,
[emailAddress] [varchar](255) NOT NULL,
[taskCommand] [varchar](max) NOT NULL,
[executionDate] [datetime] NOT NULL)
3)任务通知列表
CREATE TABLE taskSubscribers (
[emailAddress] [varchar](255) NOT NULL,
[finalDate] [datetime] NOT NULL,
[initialDate] [datetime] NOT NULL)
这是棘手的部分:
我需要根据今天和最后一天之间的差异来计算每天应该运行哪些任务。每天只应执行1个任务(如果计算的差异在两个(或更多)任务的中间进行,则应该运行具有最高优先级的任务,然后如果有多个任务,则剩余的任务应该是一个使用较大的taskStartDate
)并且不应选择已执行的任务。但是,如果initialDate
发生在这些任务的时间线之后应该 crunched ,以便为每个任务订阅者运行大多数任务。 (解释正当英语不是我的母语很复杂。)
这有点混乱(至少对我来说),应该用SQL解决(T-SQL没关系)。我可以设法运行几个连续的查询...
到目前为止,我只使用此查询取得了部分成功:
Select audience.jobId,
audience.emailAddress,
audience.taskCommand,
audience.execDate,
audience.remainingDays,
audience.taskStartDate,
audience.taskEndDate,
audience.taskPriority
From (Select 1 As jobId, /*Hardcoded*/
remainings.emailAddress,
tp.taskCommand,
GetDate() As execDate,
remainings.remainingDays,
tp.taskStartDate,
tp.taskEndDate,
tp.taskPriority
From taskPriorities tp
Inner Join (Select subs.emailAddress,
DATEDIFF(DAY, GetDate(), subs.finalDate) As remainingDays
From taskSubscribers subs) remainings On remainings.remainingDays Between tp.taskEndDate And tp.taskStartDate) audience
Left Join taskLog tl On tl.taskCommand = audience.taskCommand And tl.emailAddress = audience.emailAddress
Where tl.id Is Null
And audience.taskCommand = ( Select Top 1 tpr.taskCommand
From taskPriorities tpr
Where audience.remainingDays Between tpr.taskEndDate And tpr.taskStartDate
Order By tpr.taskPriority desc , tpr.taskStartDate, tpr.taskEndDate)
(所有这些都在http://sqlfiddle.com/#!3/67dd7/1/0)
一些例子:
|----------|---------|
-20 -10 0
Task 1 P1 |-----------|
Task 2 P2 |-----------|
订阅者1,第17天的初始日期< = -20应该运行任务1.在第15天应该运行任务2(任务1已经执行)。
订阅者2,初始日期为-15,应该运行任务1,因为它是较旧的任务,并且在第14天应该运行任务2.
任何人都可以在 crunching 部分给我一些线索吗?
由于