所以我有以下数据来表示计划工作的员工数量的小时和小时。
Hour QuarterHour EmployeesWorking
13:00:00.0000000 13:00:00.0000000 2
13:00:00.0000000 13:15:00.0000000 1
13:00:00.0000000 13:30:00.0000000 1
13:00:00.0000000 13:45:00.0000000 1
14:00:00.0000000 14:00:00.0000000 5
14:00:00.0000000 14:15:00.0000000 1
14:00:00.0000000 14:30:00.0000000 2
14:00:00.0000000 14:45:00.0000000 1
我需要能够最大限度地提高员工的工作水平,但仅限于至少有两个季度的覆盖范围。所以在上面的数据中,我会在13:00时返回1,在14:00时返回2。
有什么好办法吗?我一直试图进行一系列不同的计算(Max,Sum(EmployeesWorking)/ 2等),他们让我很接近,但我需要精确计算。
由于
答案 0 :(得分:2)
如果你在一小时内点票,你总是会选择第二项,所以这样做:
SELECT * FROM
(
SELECT ROW_NUMBER()
OVER (PARTITION BY Hour ORDER BY EmployeesWorking DESC) AS RowNum, *
FROM Table
) AS Agg
WHERE RowNum = 2
答案 1 :(得分:1)
似乎很简单 - 您想要每小时的最大值,丢弃一个最高值。对我来说听起来像ROW_NUMBER
2:
;with OrderedWork as (
select [Hour],EmployeesWorking,ROW_NUMBER() OVER (PARTITION BY [HOUR] ORDER BY EmployeesWorking desc) as rn
from @schedule
)
select * from OrderedWork where rn=2
结果:
Hour EmployeesWorking rn
---------------- ---------------- --------------------
13:00:00.0000000 1 2
14:00:00.0000000 2 2
如果5
小时内有两个14:00
,则该小时的结果为5
- 因为一个那些行会排在第二位(但哪一行是未知的)。
注意,不同的窗口函数(例如RANK
)不合适,因为不想要将绑定的结果合并在一起。
数据设置:
declare @schedule table ([Hour] time,QuarterHour time,EmployeesWorking int)
insert into @schedule ([Hour], QuarterHour, EmployeesWorking) values
('13:00:00.0000000','13:00:00.0000000',2),
('13:00:00.0000000','13:15:00.0000000',1),
('13:00:00.0000000','13:30:00.0000000',1),
('13:00:00.0000000','13:45:00.0000000',1),
('14:00:00.0000000','14:00:00.0000000',5),
('14:00:00.0000000','14:15:00.0000000',1),
('14:00:00.0000000','14:30:00.0000000',2),
('14:00:00.0000000','14:45:00.0000000',1)