簡體   English   中英

SQL Server根據日期和狀態聚合行

[英]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個正在RunningCompleted作業狀態,並且您希望兩者之間存在時間差,則可以通過將case語句放在maxmin來使用條件聚合:

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM