我有一些名为cohort,type,stage,cohort_eval tracker的表。队列表是团队或组的列表。类型表是可以分配给同类群组的评估类型列表。类型表中只有两种类型。阶段表是一个类型中的阶段列表(假设有3个阶段,但可以添加更多阶段)。例如,Type 1可以包含stage1,stage2,stage3 ......等。 cohort_eval_tracker是一个表,用于跟踪已分配队列的评估。只有在前一阶段完成后,才能为同类群组分配一个阶段。例如,如果类型1阶段1在1月1日结束,那么可以指定一个队列在1月2日采用类型2阶段2。可以同时为两个类型分配同类群组。因此,如果队列被分配了类型1阶段1,他们也可以同时进行类型2阶段2,只要类型2阶段1在类型2阶段2开始之前结束。
我想创建一个SELECT语句,该语句返回仍然可以在最大阶段分配评估的同类群组。因此,如果一个队列没有进行任何评估,我希望他们返回,或者如果一个队列没有被分配到他们的最后阶段(对于这个例子,它是第3阶段,但将来可以添加更多)然后我想要那个队列被退回。我在下面的尝试是不正确的,因为即使他们已经完成了类型1和类型2中的所有3个阶段,它仍然返回队列1。
SELECT
cohortID, cohortName
FROM
dbo.cohort
WHERE
cohortID NOT IN (SELECT cohortID
FROM cohort_eval_tracker
WHERE stageID = (SELECT MAX(stageID) FROM stage)
AND endDate < GETDATE())
OR
cohortID NOT IN (SELECT cohortID
FROM cohort_eval_tracker
WHERE stageID = 2 AND (typeID = 1 OR typeID = 2))
Cohort_eval_tracker:
╔══════════════╦══════════╦════════╦═════════╦═══════════╦═══════════╗
║ cohortEvalID ║ cohortID ║ typeID ║ stageID ║ startDate ║ endDate ║
╠══════════════╬══════════╬════════╬═════════╬═══════════╬═══════════╣
║ 1 ║ 1 ║ 1 ║ 1 ║ 1/10/2015 ║ 1/11/2015 ║
║ 2 ║ 1 ║ 1 ║ 2 ║ 1/12/2015 ║ 1/22/2015 ║
║ 3 ║ 1 ║ 1 ║ 3 ║ 1/30/2015 ║ 2/1/2015 ║
║ 4 ║ 1 ║ 2 ║ 1 ║ 1/2/2015 ║ 1/3/2015 ║
║ 5 ║ 1 ║ 2 ║ 2 ║ 1/4/2015 ║ 1/5/2015 ║
║ 6 ║ 1 ║ 2 ║ 3 ║ 1/6/2015 ║ 1/7/2015 ║
║ 6 ║ 2 ║ 1 ║ 2 ║ 3/10/2016 ║ 3/16/2016 ║
╚══════════════╩══════════╩════════╩═════════╩═══════════╩═══════════╝
阶段:
╔═════════╦═══════════╗
║ stageID ║ stageName ║
╠═════════╬═══════════╣
║ 1 ║ stage1 ║
║ 2 ║ stage2 ║
║ 3 ║ stage3 ║
╚═════════╩═══════════╝
队列:
╔══════════╦════════════╗
║ cohortID ║ cohortName ║
╠══════════╬════════════╣
║ 1 ║ cohort1 ║
║ 2 ║ cohort2 ║
╚══════════╩════════════╝
类型:
╔════════╦══════════╗
║ typeID ║ typeName ║
╠════════╬══════════╣
║ 1 ║ type1 ║
║ 2 ║ type2 ║
╚════════╩══════════╝
答案 0 :(得分:0)
WHERE语句只需要一个子查询和一个相关的子查询。
SELECT cohortID, cohortName
FROM dbo.cohort
WHERE cohortID NOT IN (SELECT cohortID
FROM cohort_eval_tracker
WHERE (stageID = (SELECT MAX(stageID)
FROM stage)
AND endDate < GETDATE())
OR (stageID = 2
AND (typeID = 1 OR typeID = 2)))
或者通过加入表格并使用相关的子查询从舞台中选择MAX
stageID。
SELECT c.cohortID, c.cohortName
FROM dbo.cohort c
INNER JOIN cohort_eval_tracker cet ON c.cohortID = cet.cohortID
WHERE (cet.stageID = (SELECT MAX(stageID) FROM stage) AND cet.endDate < GETDATE())
OR (cet.stageID = 2 AND (cet.typeID = 1 OR cet.typeID = 2))