sql - SQL 查询以获取基于单个日期时间列的特定状态所花费的时间
问题描述
我需要构建一个 SQL 查询,在其中我可以花在多个状态上的时间(onHold、Waiting for customer、Resolved、Closed),所以基本上我不想包括花在这个状态上的时间,表格如下所示
所以我需要一个查询,我可以在其中获得实际花费在票证上的时间或花费在状态上的时间,到目前为止我已经尝试过以下解决方案并尝试过Cross APPLY
,但似乎都没有像预期的那样帮助我。
到目前为止尝试了下面的查询,这给了我在第一个等待状态上花费的正确时间,而不是在那之后:
SELECT t1.TICKETNUMBER,SUM(DATEDIFF(MINUTE,TICKETTIME,CloseTime)) as TotalMinutes
FROM [Admin].[TbtrnTicketHistory] t1
CROSS APPLY(SELECT TOP 1 TICKETTIME as CloseTime FROM [Admin].[TbtrnTicketHistory] t2 WHERE t1.TICKETNUMBER = t2.TICKETNUMBER and t2.TICKETHISTORYID > t1.TICKETHISTORYID ORDER BY t2.TICKETTIME) as t2
WHERE t1.CURRENTSTATUS_ANALYST not in('On-Hold','Waiting For Customer','Resolved','Closed') and t1.ticketnumber = '211135'
GROUP BY t1.TICKETNUMBER;
解决方案
使用 SQL Server,您可以使用那些非常有用的窗口函数 LEAD 和 FIRST_VALUE :
select *
,[duration(sec)] = DATEDIFF(SECOND
,ticketTime
,LEAD(ticketTime,1,ticketTime)over(partition by ticketNumber order by ticketTime)
)
,[cumulative duration(sec)] = DATEDIFF( SECOND
, FIRST_VALUE(ticketTime)over(partition by ticketNumber order by ticketTime)
, ticketTime)
from (values
(1,cast('20211101 10:00:01' as datetime))
,(1,'20211101 10:00:33')
,(1,'20211101 10:01:59')
)T(ticketNumber,ticketTime)
票号 | 票时间 | 持续时间(秒) | 累积持续时间(秒) |
---|---|---|---|
1 | 2021-11-01 10:00:01.000 | 32 | 0 |
1 | 2021-11-01 10:00:33.000 | 86 | 32 |
1 | 2021-11-01 10:01:59.000 | 0 | 118 |
推荐阅读
- git - 链接到来自 bitbucket 中的提交的问题
- c# - MICROSOFT 认知人脸 API 人物组
- python - 对于逐字节相同的对象,assertEqual 失败?
- javascript - 设置背景颜色以保存画布图表
- javascript - 全局对象在 Visual Studio Code [JavaScript] 中不起作用
- go - 使用并发提高搜索效率
- reactjs - 如何将 React.createContext() 与反应路由器一起使用?
- python - 如何使用 Python 从 Maya 中的当前视图创建相机?
- electron - 电子 - BrowserWindow minWidth 在 Windows 上不受尊重
- service - PS4远程锁定程序/服务(自定义程序)