2

そのため、勤務予定の従業員数で時間と 15 分を表す次のデータがあります。

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

働いている従業員を最大限に引き出せるようにする必要がありますが、そのカバレッジが少なくとも 2 つの四半期にある場合に限られます。したがって、上記のデータでは、13:00 の場合は 1 を返し、14:00 の場合は 2 を返します。

これを行う良い方法はありますか?私はさまざまな計算 (Max、Sum(EmployeesWorking)/2 など) を試みてきましたが、それらは私を近づけますが、正確な数が必要です。

ありがとう

4

2 に答える 2

2

1 時間以内のカウントで注文すると、常に 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

単純なようです。1時間ごとに最大値が必要であり、最も高い値を1つ破棄します。それは私には2のように聞こえROW_NUMBERます:

;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

たとえば、1時間に25秒あった場合、14:00その時間の結果は次のようになります。これらの行の1つ5が2番目になるためです(ただし、どちらが不明であるか)。

関連付けられた結果をマージしたくないため、別のウィンドウ関数(など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 に答える