[英]SQL Server Aggregating Rows based on Date and Status
嗨,我想根據下表了解作業執行時間。 例如,1/24/17,Running和Completed之間的時差是17分鍾。
**JobName** **CurrentJobStatus** **TimeOfChange**
Customer Completed 1/24/17 0:17
Customer Running 1/24/17 0:00
Customer Waiting 1/23/17 20:30
Customer Completed 1/21/17 0:47
Customer Idle 1/21/17 16:00
Customer Running 1/21/17 0:30
Customer Completed 1/20/17 0:31
Customer Idle 1/20/17 16:00
Customer Running 1/20/17 0:15
Customer Waiting 1/20/17 20:30
Customer Completed 1/19/17 0:37
Customer Idle 1/19/17 16:00
Customer Running 1/19/17 0:20
Customer Waiting 1/19/17 20:30
假設每天只有1個正在Running
和Completed
作業狀態,並且您希望兩者之間存在時間差,則可以通過將case
語句放在max
或min
來使用條件聚合:
select * , datediff(minute, completed, running)
from (
select
convert(date, TimeOfChange) change_date,
max(case when CurrentJobStatus = 'Completed' then TimeOfChange end) completed,
min(case when CurrentJobStatus = 'Running' then TimeOfChange end) running
from mytable
group by convert(date, TimeOfChange)
) t order by change_date
我在('Completed','Running')中選擇了CurrentJobStatus的行,然后我按TimeOfChange排序的CurrentJobStatus設置了排名。 這為每對('已完成','正在運行')添加了一個序列號
最后按此等級分組,在最大和最小日期之間獲得約會。
with tm as
(
select JobName, CurrentJobStatus, TimeOfChange,
rank() over (partition by CurrentJobStatus order by TimeOfChange desc) rn
from jobs
where CurrentJobStatus in ('Completed', 'Running')
)
select
rn, DateDiff(minute, min(TimeOfChange), max(TimeOfChange)) as min
from tm
group by rn;
請在此處查看: http : //rextester.com/NZFWXO47289
這可能很棘手。 如果我們假設“Running”和“Completed”完全交織在一起(沒有兩個“Running”后跟一個“Completed”),那么你可以通過計算每條記錄之前或之前的“Running”記錄的數量來識別匹配。 其余的只是聚合:
select min(case when CurrentJobStatus = 'Running' then TimeOfChange end) as running_time,
max(case when CurrentJobStatus = 'Completed' then TimeOfChange end) as completed_time,
datediff(minute,
min(case when CurrentJobStatus = 'Running' then TimeOfChange end),
max(case when CurrentJobStatus = 'Completed' then TimeOfChange end)
) as diff_in_minutes
from (select t.*,
sum(case when CurrentJobStatus = 'Running' then 1 else 0 end) over (order by TimeOfChange) as running_running
from t
) t
group by running_running;
如果假設不正確並且您可以連續多次“運行”或連續“完成”,那么您應該使用適當的樣本數據和規則說明來提出另一個問題。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.