【问题标题】:Calculate time spent on each Status计算每个状态花费的时间
【发布时间】:2019-09-04 11:58:35
【问题描述】:

有如下调度日志表:

ScheduleLogID   |ScheduleID |WorkerStatusID |StatusLogDatetime
------------------------------------------------------------------------
38              |202            |1          |2019-09-04 12:06:43.6216195
39              |202            |4          |2019-09-04 12:07:33.1519370
40              |202            |1          |2019-09-04 12:07:43.6976046
41              |202            |2          |2019-09-04 12:07:53.3540665
42              |202            |1          |2019-09-04 12:08:01.4505184
43              |202            |3          |2019-09-04 12:08:10.1397741
44              |202            |1          |2019-09-04 12:08:16.0210118
45              |202            |2          |2019-09-04 12:08:24.8038681
46              |202            |1          |2019-09-04 12:08:31.5119111
47              |202            |5          |2019-09-04 12:08:42.3227804
48              |224            |1          |2019-09-04 12:21:13.6859968
49              |224            |4          |2019-09-04 12:22:54.9930462
50              |224            |1          |2019-09-04 12:23:00.8586838
51              |224            |4          |2019-09-04 12:23:07.6291272
52              |224            |1          |2019-09-04 12:23:12.2779570
53              |224            |2          |2019-09-04 12:23:20.0936071
54              |224            |1          |2019-09-04 12:23:26.2556466
55              |224            |4          |2019-09-04 12:23:40.5921385
56              |224            |1          |2019-09-04 12:23:48.6417901
57              |224            |5          |2019-09-04 12:23:56.3482395

如何计算每个Status 花费在每个Schedule 上的总时间?

结果应该是这样的:

ScheduleID     |WorkerStatusID    |TimeSpent
--------------------------------------------
202            |1                 |06:30:00
202            |2                 |00:15:00
202            |3                 |00:30:00
202            |4                 |00:15:05
224            |1                 |06:45:00
224            |2                 |00:20:00
224            |3                 |00:25:00
224            |4                 |00:10:05

【问题讨论】:

  • 到目前为止,您尝试了哪些方法来解决问题?另外,请不要将数据作为图像提供;您寻求帮助的用户无法使用它,使其有点无用。以表格格式 text 或 DDL 和 DML 语句的形式提供数据。
  • 计算总时间的公式/逻辑是什么?
  • A Worker 可以处于不同的状态:1-工作,2-暂停.... 5-完成。每次他更改时,我都会记录时间和状态,并想知道他在每个状态上花了多少时间,直到他Finished

标签: sql-server reporting


【解决方案1】:

试试这个(我的数字与你的样本结果不符):

with mytablelead(ScheduleLogID, ScheduleID, WorkerStatusID, StatusLogDatetime, leadtime) as
(
select ScheduleLogID, ScheduleID, WorkerStatusID, StatusLogDatetime,
    lead(StatusLogDatetime) over(partition by ScheduleID order by StatusLogDatetime) as leadtime
from mytable
)
select ScheduleID, WorkerStatusID, sum(datediff(ss, StatusLogDatetime, leadtime)) as totalsecs
from mytablelead
group by ScheduleID, WorkerStatusID
order by ScheduleID, WorkerStatusID

【讨论】:

  • 其紧密而优雅:) 问题是Schedule 的最后一条记录占用了下一个Schedule 的第一条记录的LeadTime,它应该是NULL
  • @FlamurDervishi 我把 ISNULL() 拿出来给你最后一条记录的 NULL。
  • 是的,我知道,但它只为最后一个Schedule 的最后一条记录生成NULL。通常它应该为任何Schedule 的每条最后一条记录生成NULL
  • @FlamurDervishi 感谢您帮助我清楚地理解问题。我通过添加分区子句进行了适当的更改。
  • 感谢您的时间和帮助:)
【解决方案2】:

没有上述方法那么优雅,但这是我想要的:

SELECT OUTSL1.ScheduleID,
       OUTSL1.StartStatus as [Worker Status],
       SUM(DATEDIFF(s,OUTSL1.StartTime, OUTSL1.StopTime)) as TimeSpent
FROM (SELECT [SL].ScheduleID
            ,[SL].StatusLogDatetime as StartTime
            ,LEAD([SL].StatusLogDatetime) over(partition by [SL].ScheduleID order by [SL].StatusLogDatetime ASC) as StopTime
            ,[SL].WorkerStatusID as StartStatus
            ,LEAD([SL].WorkerStatusID) over(partition by [SL].ScheduleID order by [SL].StatusLogDatetime ASC) as StopStatus
      FROM [iFacility].[dbo].[tblScheduleLogs] as [SL]) as OUTSL1
WHERE OUTSL1.StartStatus = 1
GROUP BY ScheduleID, StartStatus

通过上述查询,我​​设法为Status = 1 计算它。 我对其他 Statuses 和所有这些查询中的 UNION 做了同样的事情。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多