Я играл с наборами в SQL Server 2000 и имеют следующую структуру таблицы для одного из моих временных таблиц (#Periods):Выбор SUM значений TOP 2 в таблице с несколькими GROUP в SQL
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 может иметь любое количество периодов отдыха (не включая ни одного).
Мое текущее решение не очень элегантно, и в основном включает в себя следующие этапы:
- Получить максимальную продолжительность отдыха, группы по HoursCTR
- Выберите первый (мин) RestCTR строку, которая возвращает эту максимальную продолжительность для каждого HoursCTR
- Повторите шаг 1 (за исключением строк уже собранных на стадии 2)
- Повторите шаг 2 (опять же, за исключением строк, собранных на стадии 2)
- Объединить в RestCTR строки (из шага 2 и 4) в одну таблицу
- Get сумма длительностей указала на строки на этапе 5, сгруппированной по HoursCTR
Если есть какая-либо функция множества, которые разрежут этот процесс вниз, они было бы очень желанным.
как это выбрать два _longest_ перерывы Что мне не хватает? – Arkadiy
OP указывает SQL Server 2000. ROW_NUMBER() и CTE недоступны. – bobs
@bobs: Спасибо, я пропустил это. Я добавил другое решение. –