计算小时是否至少有一半覆盖率

时间:2012-06-20 13:14:16

标签: sql sql-server

所以我有以下数据来表示计划工作的员工数量的小时和小时。

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等),他们让我很接近,但我需要精确计算。

由于

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)