Torrwin
asked on
Recursive query to determine worfklow with dependencies
Hello,
I have table with widgets and a table with tasks. Each widget has one of each of the tasks, none get left out.
The tables look something like so:
tblWidget
Widget_ID INT
Deadline DATETIME
tblTask
Task_ID CHAR(5)
Duration_Days INT
tblWorkflow
Widget_ID INT
Task_ID CHAR(5)
Completion_Date_Estimate DATETIME
Completion_Date_Actual DATETIME
tblWorkflowHierarchy
Workflow_ID INT **Identity
Task_ID CHAR(5) **FK to tblTask
Parent_Task_ID CHAR(5) **FK to tblTask
The widgets each have a deadline of when they need to be completed. Several of the tasks can run in parallel, but cannot start if their parent task has not been completed. (i.e. has no value in Completion_Date_Actual)
I need a query that can backwards calculate the "maximum path", or the maximum length of time the longest line of tasks line of tasks. So, if we knew in advance that the longest path was 29 days, given a due date of 6/30/13, the query would return 6/29/13.
Thanks in advance,
-Torrwin
I have table with widgets and a table with tasks. Each widget has one of each of the tasks, none get left out.
The tables look something like so:
tblWidget
Widget_ID INT
Deadline DATETIME
tblTask
Task_ID CHAR(5)
Duration_Days INT
tblWorkflow
Widget_ID INT
Task_ID CHAR(5)
Completion_Date_Estimate DATETIME
Completion_Date_Actual DATETIME
tblWorkflowHierarchy
Workflow_ID INT **Identity
Task_ID CHAR(5) **FK to tblTask
Parent_Task_ID CHAR(5) **FK to tblTask
The widgets each have a deadline of when they need to be completed. Several of the tasks can run in parallel, but cannot start if their parent task has not been completed. (i.e. has no value in Completion_Date_Actual)
I need a query that can backwards calculate the "maximum path", or the maximum length of time the longest line of tasks line of tasks. So, if we knew in advance that the longest path was 29 days, given a due date of 6/30/13, the query would return 6/29/13.
Thanks in advance,
-Torrwin
ASKER
Well, since they're in parallel we can't assign them a straight index to order them by. I was planning to use recursively go through the hierarchy table. Like so:
Iteration 1:
Select Task_ID FROM tblWorkflowHierarchy WHERE Parent_Task_ID is Null
Iteration 2:
Loop through results from iteration 1 and do the following on each:
Select Task_ID FROM tblWorkflowHierarchy WHERE Parent_Task_ID = Iteration 1 Task_ID
...etc...
Iteration 1:
Select Task_ID FROM tblWorkflowHierarchy WHERE Parent_Task_ID is Null
Iteration 2:
Loop through results from iteration 1 and do the following on each:
Select Task_ID FROM tblWorkflowHierarchy WHERE Parent_Task_ID = Iteration 1 Task_ID
...etc...
Ah. Then it gets easier.
Let's start with this query. At line five, modify the commented filter rule to select only a few widget_ID values so the results are manageable.
Let's start with this query. At line five, modify the commented filter rule to select only a few widget_ID values so the results are manageable.
WITH rq AS
(
SELECT 1 as level, Widget_ID, Task_ID FROM tblWorkflowHierarchy
WHERE Parent_Task_ID is NULL
-- AND Widget_ID between 10 and 15
UNION ALL
SELECT level+1, Widget_ID, Task_ID FROM tblWorkflowHierarchy t0, Rq
WHERE t0.Widget_ID = Rq.Widget_ID
AND t0.Task_ID = r1.Widget_ID + 1
)
SELECT * FROM rq;
ASKER
Hmm, Task_ID isn't an integer so it can't ever be equal to Widget_ID + 1
Ok. So how do we serialize the rows for each widget? Does the value of Task_ID increase "AAAAA", "AAAAB", "AACGR", etc.?
ASKER CERTIFIED SOLUTION
membership
This solution is only available to members.
To access this solution, you must be a member of Experts Exchange.
That brings us back to my very first post -- "The key items in a recursive query are to establish the correct starting point and to sequence the items in the correct order".
How do we sequence these events from the data?
How do we sequence these events from the data?
ASKER
This set me down the right track, thanks!
The key items in a recursive query are to establish the correct starting point and to sequence the items in the correct order.
One of the nice things about CTE syntax is that if we know the logical order we can create a row order for the recursive query.
With that as a background, how do you determine the assembly order? And how do you identify the parallel tasks that can, perhaps, be discounted?
Kent