2

所以我有以下数据,这些数据用计划工作的员工人数来重新设置小时和一刻钟。

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 等),它们让我很接近,但我需要准确的计数。

谢谢

4

2 回答 2

2

如果您在一小时内按数量订购,您总是会选择第二个项目,所以这样做:

SELECT * FROM
(
    SELECT ROW_NUMBER() 
        OVER (PARTITION BY Hour ORDER BY EmployeesWorking DESC) AS RowNum, *
    FROM Table
) AS Agg
WHERE RowNum = 2
于 2012-06-20T13:19:36.353 回答
1

看起来很简单 - 你想要每小时的最大值,丢弃一个最大值。这对我来说听起来像ROW_NUMBER2:

;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

例如,如果一小时中有两个5s 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)
于 2012-06-20T13:27:21.850 回答