Oracle - 如何检查多个记录中的值以及一个值是否匹配 - 将其用于更大的数据集
Oracle - How to check values from multiple records and if one values matches - use it for larger dataset
这是我的数据:
Step random_task Status date
1 do_this Completed 1-Nov-2020
1 do-that Cancelled 2-Nov-2020
2 do_this Not Assigned 1-Nov-2020
2 do_that Cancelled 2-Nov-2020
2 and_that Cancelled 2-Nov-2020
3 do_this Cancelled 2-Nov-2020
3 do_that Cancelled 2-Nov-2020
3 also_that Cancelled 2-Nov-2020
4 do_that In Progress or Scheduled or whatever 1-Nov-2020
4 and_that Completed 2-Nov-2020
按步骤分组:
已完成=如果步骤中的所有任务都APS_Status__c=“已完成”。
已完成 = 如果至少有 1 个任务“已完成”并且所有剩余任务 =“已取消”。
未开始 = 如果至少有 1 个任务“未分配”并且所有剩余任务 =“已取消”。
未开始=如果步骤中的所有任务都APS_Status__c =“未分配”。
已取消=如果步骤中的所有任务都APS_Status__c =“已取消”。
进行中 = 如果至少有 1 个任务 <>“已完成”或“已取消”或“未分配”。
输出:
Step Status date
1 Completed 2-Nov-2020 (if status = completed, then max(date) of that step
2 Not Started (null)
3 Cancelled (null)
4 In Progress (null)
我试过为 100、-100 和 0 添加赋值,将其相加,然后提取 mod(sum,100) 以确定正确的值。但是我无法为该步骤分配最大(日期)。
您可以按如下方式使用 GROUP BY 和条件聚合:
SELECT STEP, STATUS, CASE WHEN STATUS = 'Completed' THEN DATE END AS DATE FROM
(SELECT STEP,
DATE,
CASE WHEN COMPLETED = TOTAL THEN 'Completed'
WHEN (COMPLETED >= 1 AND CANCELLED = TOTAL - COMPLETED)
OR (NOTASSIGNED >= 1 AND CANCELLED = TOTAL - NOTASSIGNED) THEN 'Cancelled'
WHEN NOTASSIGNED = TOTAL THEN 'Not Assigned'
WHEN CANCELLED = TOTAL THEN 'Cancelled'
END AS STATUS
FROM
(SELECT STEP,
COUNT(CASE WHEN STATUS = 'Completed' THEN 1 END) AS COMPLETED,
COUNT(CASE WHEN STATUS = 'Cancelled' THEN 1 END) AS CANCELLED,
COUNT(CASE WHEN STATUS = 'Not Assigned' THEN 1 END) AS NOTASSIGNED,
COUNT(CASE WHEN STATUS = 'In Progress' THEN 1 END) AS INPROGRESS,
COUNT(1) AS TOTAL,
MAX(DATE) AS DATE
FROM YOUR_TABLE
GROUP BY STEP))
我不确定正在进行中的情况,请自行处理。
您可以使用条件聚合作为:
select step,
(case when min(status) = max(status) and min(status) in ('Completed', 'Cancelled')
then min(status)
when sum(case when status in ('Completed', 'Cancelled') then 1 else 0 end) = count(*)
then 'Completed'
when sum(case when status in ('Not Assigned', 'Cancelled') then 1 else 0 end) = count(*)
then 'Not Started'
then ''
else 'In Progress'
end) as status,
(case when min(status) = max(status) and min(status) in 'Completed'
then max(date)
end)
from t
group by step;
这些稍微简化了您的逻辑。特别是,“已完成”和“已取消”在逻辑中首先处理——如果所有状态都相同。如果所有状态均为“未分配”或“已取消”,则步骤为“未开始”。
这是我的数据:
Step random_task Status date
1 do_this Completed 1-Nov-2020
1 do-that Cancelled 2-Nov-2020
2 do_this Not Assigned 1-Nov-2020
2 do_that Cancelled 2-Nov-2020
2 and_that Cancelled 2-Nov-2020
3 do_this Cancelled 2-Nov-2020
3 do_that Cancelled 2-Nov-2020
3 also_that Cancelled 2-Nov-2020
4 do_that In Progress or Scheduled or whatever 1-Nov-2020
4 and_that Completed 2-Nov-2020
按步骤分组:
已完成=如果步骤中的所有任务都APS_Status__c=“已完成”。
已完成 = 如果至少有 1 个任务“已完成”并且所有剩余任务 =“已取消”。
未开始 = 如果至少有 1 个任务“未分配”并且所有剩余任务 =“已取消”。
未开始=如果步骤中的所有任务都APS_Status__c =“未分配”。
已取消=如果步骤中的所有任务都APS_Status__c =“已取消”。
进行中 = 如果至少有 1 个任务 <>“已完成”或“已取消”或“未分配”。
输出:
Step Status date
1 Completed 2-Nov-2020 (if status = completed, then max(date) of that step
2 Not Started (null)
3 Cancelled (null)
4 In Progress (null)
我试过为 100、-100 和 0 添加赋值,将其相加,然后提取 mod(sum,100) 以确定正确的值。但是我无法为该步骤分配最大(日期)。
您可以按如下方式使用 GROUP BY 和条件聚合:
SELECT STEP, STATUS, CASE WHEN STATUS = 'Completed' THEN DATE END AS DATE FROM
(SELECT STEP,
DATE,
CASE WHEN COMPLETED = TOTAL THEN 'Completed'
WHEN (COMPLETED >= 1 AND CANCELLED = TOTAL - COMPLETED)
OR (NOTASSIGNED >= 1 AND CANCELLED = TOTAL - NOTASSIGNED) THEN 'Cancelled'
WHEN NOTASSIGNED = TOTAL THEN 'Not Assigned'
WHEN CANCELLED = TOTAL THEN 'Cancelled'
END AS STATUS
FROM
(SELECT STEP,
COUNT(CASE WHEN STATUS = 'Completed' THEN 1 END) AS COMPLETED,
COUNT(CASE WHEN STATUS = 'Cancelled' THEN 1 END) AS CANCELLED,
COUNT(CASE WHEN STATUS = 'Not Assigned' THEN 1 END) AS NOTASSIGNED,
COUNT(CASE WHEN STATUS = 'In Progress' THEN 1 END) AS INPROGRESS,
COUNT(1) AS TOTAL,
MAX(DATE) AS DATE
FROM YOUR_TABLE
GROUP BY STEP))
我不确定正在进行中的情况,请自行处理。
您可以使用条件聚合作为:
select step,
(case when min(status) = max(status) and min(status) in ('Completed', 'Cancelled')
then min(status)
when sum(case when status in ('Completed', 'Cancelled') then 1 else 0 end) = count(*)
then 'Completed'
when sum(case when status in ('Not Assigned', 'Cancelled') then 1 else 0 end) = count(*)
then 'Not Started'
then ''
else 'In Progress'
end) as status,
(case when min(status) = max(status) and min(status) in 'Completed'
then max(date)
end)
from t
group by step;
这些稍微简化了您的逻辑。特别是,“已完成”和“已取消”在逻辑中首先处理——如果所有状态都相同。如果所有状态均为“未分配”或“已取消”,则步骤为“未开始”。