Выбор СУММЫ ТОП 2 значений в таблице с несколькими GROUP в SQL

Я играл с сетами в SQL Server 2000 и иметь следующую структуру таблицы для одной из моих временных таблиц (#Periods):

    RestCTR     HoursCTR    Duration    Rest
    ----------------------------------------
    1           337         2           0
    2           337         46          1
    3           337         2           0
    4           337         46          1
    5           338         1           0
    6           338         46          1
    7           338         2           0
    8           338         46          1
    9           338         1           0
    10          339         46          1
    ...

Я бы хотел вычислить сумму двух самых длительных периодов отдыха для каждого HoursCTR, предпочтительно используя наборы и временную таблицы (а не курсоры или вложенные подзапросы).

Вот запрос мечты, который просто не будет работать в SQL (независимо от того, сколько раз я его запускал):

Select HoursCTR, SUM ( TOP 2 Duration ) as LongestBreaks
FROM #Periods
WHERE Rest = 1
Group By HoursCTR    

HoursCTR может иметь любое количество периодов отдыха ( в том числе нет).

Мое текущее решение не очень элегантно и в основном включает следующие шаги:

  1. Получить максимальную продолжительность отдыха, сгруппировать по HoursCTR
  2. Выбрать первую (минимальную) строку RestCTR, которая возвращает эту максимальную продолжительность для каждого HoursCTR
  3. Повторить шаг 1 (исключая строки, уже собранные на шаге 2)
  4. Повторить шаг 2 (опять же, исключая строки, собранные на шаге 2)
  5. Объедините строки RestCTR (с шага 2 и 4) в одну таблицу
  6. Получить СУММ длительности, на которую указывают строки в шаге 5, сгруппированные по HoursCTR

Если есть какие-либо заданные функции, которые сокращают этот процесс, они будут очень приветствоваться.

9
задан Martijn Pieters 30 July 2014 в 17:44
поделиться