sql - SQL Server 将 DATEDIFF 的累积 SUM 转换为百分比
问题描述
我正在尝试从我拥有的一些基本数据中将 DATEDIFF 的累积总和转换为百分比,这是一个小快照:
ID IIn IOut
AB123 2015-11-06 15:24:44.057 2015-11-14 01:00:00.000
QA565 2015-10-27 20:12:19.753 2015-11-06 03:00:00.000
UN555 2015-12-29 06:29:23.417 2016-01-03 08:00:00.000
LG602 2015-08-07 16:52:13.573 2015-08-11 03:00:00.000
ETC ETC
然后我使用 DATEDIFF 来获取天数:
SELECT ID, DATEDIFF(hour, IIn, IOut)/24.0 IDays
FROM TimeTable
这给了我:
ID IDays
AB123 7.416666
QA565 9.291666
UN555 5.083333
LG602 3.458333
我想要的是ID
'S 的计数除以他们IDay
的 's (向下舍入),累积百分比从最低IDay
's 到最高,如下所示:
ID IDays IDaysPer
LG602 3 12.5
UN555 5 33.33
AB123 7 62.49
QA565 9 100
解决方案
您可以使用几个窗口聚合来执行此操作,为方便起见将原始查询放在 CTE 中(子查询也可以):
declare @timeTable table (ID char(5) not null, IIn datetime not null,
IOut datetime not null)
insert into @timeTable(ID,IIn,IOut) values
('AB123','2015-11-06T15:24:44.057','2015-11-14T01:00:00.000'),
('QA565','2015-10-27T20:12:19.753','2015-11-06T03:00:00.000'),
('UN555','2015-12-29T06:29:23.417','2016-01-03T08:00:00.000'),
('LG602','2015-08-07T16:52:13.573','2015-08-11T03:00:00.000')
;With Diffs as (
SELECT ID, DATEDIFF(hour, IIn, IOut)/24.0 IDays
FROM @timeTable
)
select
*,
(
SUM(IDays) OVER (ORDER BY IDays, ID)
/
SUM(IDays) OVER ()
) * 100 as IDaysPer
from
Diffs
order by IDays
请注意,我无法完全理解您的“四舍五入”要求,但您应该能够使用围绕适当计算的任何常见舍入技术。所以我的输出与你的不太匹配:
ID IDays IDaysPer
----- --------------------------------------- ---------------------------------------
LG602 3.458333 13.696300
UN555 5.083333 33.828300
AB123 7.416666 63.201300
QA565 9.291666 100.000000
推荐阅读
- python - 如果我的交易基于同时的多个响应,如何进行原子交易
- cmake - 如何将 CMake“execute_process”命令的输出实时重定向到 STDOUT?
- ptc-windchill - 在 Windchill 中读取局部变量的值
- swift - 预计解码字典
但找到了一个数组。”,基础错误:无)) - javascript - Javascript:重命名内置函数
- c++ - 为二叉搜索树创建统一搜索函数
- react-native - 如何使用 React Native Web 录制语音?
- javascript - Vue.js 变量在基础模式中失去作用域
- android - android studio 多个dex文件定义 Lcom/google/common/reflect/Types$WildcardTypeImpl;
- python-3.x - 如何按大小对列表进行排序?