sql-server - SQL Server - 在某些条件下计算行之间的时间
问题描述
我想计算多行之间的时间基于:
- 第一个:名字
- 第二:事件类型 - 事件本身有条件,因为计算应适用于 24 小时。
条件:
如果第一个事件是“不可用”,则时间应从 00:00:00 计算到事件发生的时间。否则时间将根据“可用”与下一个“不可用”或“可用”之间的差异计算。如果最后一个活动是“可用”,时间将从活动时间开始计算到 23:59:59
毕竟,计算时间的总和与一些其他信息应该插入到另一个表中。
该表如下所示:
ID | 姓名 | 类型 | 约会时间 |
---|---|---|---|
1 | X1 | 无法使用 | 2021-03-30 04:12:00 |
2 | X1 | 可用的 | 2021-03-30 08:12:00 |
3 | X1 | 可用的 | 2021-03-30 10:12:00 |
4 | X1 | 无法使用 | 2021-03-30 11:32:00 |
5 | X1 | 可用的 | 2021-03-30 20:30:00 |
6 | X2 | 可用的 | 2021-03-30 08:30:00 |
7 | X2 | 无法使用 | 2021-03-30 18:12:00 |
解决方案
这就是我得到的似乎有效的东西。仔细检查是否缺少逻辑。
create table #test (ID int, Name varchar(4), Type varchar(20), DateTime datetime)
insert into #test values
('1', 'X1', 'Not Available', '2021-03-30 04:12:00'),
('2', 'X1', 'Available', '2021-03-30 08:12:00'),
('3', 'X1', 'Available', '2021-03-30 10:12:00'),
('4', 'X1', 'Not Available', '2021-03-30 11:32:00'),
('5', 'X1', 'Available', '2021-03-30 20:30:00'),
('6', 'X2', 'Available', '2021-03-30 08:30:00'),
('7', 'X2', 'Not Available', '2021-03-30 18:12:00')
WITH CTE
AS (SELECT *
, Time = CAST(datetime AS TIME(0))
, NextTime = LEAD(CAST(datetime AS TIME(0))) OVER(
ORDER BY id)
, RN = ROW_NUMBER() OVER(PARTITION BY name
ORDER BY id)
FROM #test),
CTE2
AS (SELECT *
, first = CASE
WHEN RN = 1
AND type = 'Not Available' THEN CAST(Time AS TIME(0))
END
, second = CAST(DATEADD(ms, DATEDIFF(second, datetime, LEAD(datetime) OVER(PARTITION BY name
ORDER BY datetime)) * 1000, 0) AS TIME(0))
FROM cte),
CTE3
AS (SELECT id
, name
, type
, datetime
, TimeDiff = ISNULL(first, second)
FROM cte2),
CTE4
AS (SELECT name
, TimeSum = CAST(DATEADD(ms, SUM(DATEDIFF(ms, '00:00:00.000', TimeDiff)), '00:00:00.000') AS TIME(0))
FROM cte3
WHERE type = 'available'
GROUP BY name)
SELECT cte3.*
, cte4.TimeSum
FROM cte4
JOIN cte3 ON cte4.name = cte3.name
推荐阅读
- excel - Excel 新手,需要一些帮助才能将数据复制到新工作表并保持运行
- google-sheets - 如何从串联列表中拆分、比较和查找差异
- javascript - 如何仅使一个元素更改 onHover (ReactJS)
- google-apps-script - 在 Google Apps 脚本中解构二维数组
- javascript - 如何在 3 次尝试使用 javascript 后禁用按钮?
- hyperledger-fabric - Hyperledger Fabric:configtx.yaml 中的 MSPDir 与 ORDERER_GENERAL_LOCALMSPDIR
- c# - WPF 托管 winforms 控件 - 仅在窗口或控件调整大小时重新计算高度
- python - set() 函数算法和“&”运算符一起使用时的复杂性
- pdf - 将带有html代码的String转换为Pdf格式,像Document的一段一样填充一个itext元素,用itext5,xmlworker
- r - 如何制作适用于两个系统的 .R/Makevars 文件?