У меня есть таблица, содержащая список людей и значение продолжительности, и мне нужно сложить общую продолжительность для каждого человека в таблице, а также отобразить количество записей для каждого человека.
PersonTable
id int
name nvarchar(max)
duration decimal(18,2)
SELECT name, sum(duration) as TotalDuration, count(*) as NumRecords
FROM PersonTable
GROUP BY name
К сожалению, я также должен убедиться, что ни один человек не помещен в группу продолжительностью более 3 часов.Если для определенного лица имеется достаточно записей, что их общее количество составляет> 3 часа, то мне нужно сгенерировать 2 группы для этого человека или столько, сколько требуется для сохранения итогового значения менее 3. Ни одна запись в базовой таблице не содержит длительности.> 3, поэтому всегда возможен действительный набор групп.
Проверка данных для ясности:
id, person, duration
1, John Smith, 2hrs
2, John Smith, 1hrs
3, John Smith, 1hrs
4, John Smith, 2hrs
1, Jane Doe, 1hrs
1, Jane Doe, 1hrs
1, Jane Doe, 2hrs
8, Jack Foo, 1hrs
Вывод: (Порядковый номер для идентификации различных групп одного и того же лица)
name, Total Duration, Num Records, Sequence Number
John Smith, 3hrs, 2, 1
John Smith, 3hrs, 2, 2
Jane Doe, 2hrs, 2, 1
Jane Doe, 2hrs, 1, 2
Jack Foo, 1hrs, 1, 1
Это решает основную проблему.На практике есть больше полей для группировки, и мне также нужно перечислить идентификаторы базовых записей, так как они будут использоваться на более позднем этапе.
Мое текущее решение - просто использовать курсоры для итерации посортировать таблицу и выводить новые группы во временную таблицу, когда общее количество часов превышает 3. Таблица темпорариев также содержит столбец значений идентификаторов, разделенных запятыми, для каждой строки базовой таблицы, участвующей в группировке.
ОднакоМне интересно, есть ли лучшее (без курсоров) решение для такого рода проблемы.Возможно ли также присоединить агрегат обратно к базовой таблице, поэтому у меня есть таблица каждой записи плюс порядковый номер, что позволяет мне группировать по человеку и порядковому номеру для воспроизведения таблицы выше?Это было бы намного лучшим решением, чем создание разделенных запятыми списков идентификаторов, которые используются для поиска исходных записей на более поздней стадии процесса.