Группировать по каждой N записи в T-SQL

У меня есть результаты тестов производительности в базе данных, и я хочу, чтобы группировать каждые 1000 записей (ранее отсортированных в порядке возрастания по дате), а затем агрегировать результаты с помощью AVG .

Я действительно ищу стандартное SQL-решение, однако любые результаты T-SQL также приветствуются.

 WITH T AS ( SELECT RANK() OVER (ORDER BY ID) Rank, P.Field1, P.Field2, P.Value1, ... FROM P ) SELECT (Rank - 1) / 1000 GroupID, AVG(...) FROM T GROUP BY ((Rank - 1) / 1000) ; 

Что-то вроде этого должно заставить вас начать. Если вы можете предоставить свою фактическую схему, я могу обновить ее по мере необходимости.

I + 1'd @Yuck, потому что я думаю, что это хороший ответ. Но стоит упомянуть NTILE ().

Причина в том, что если у вас есть 10,010 записей (например), у вас будет 11 групп – первые 10 с 1000 в них, а последние – всего 10.

Если вы сравниваете средние значения между каждой группой из 1000, вы должны либо отбросить последнюю группу, сколько не представительную группу, либо … вы можете сделать все группы одинакового размера.

NTILE () сделает все группы одинакового размера; единственное предостережение в том, что вам нужно знать, сколько групп вы хотели.

Так что если ваша таблица имела 25 250 записей, вы бы использовали NTILE (25), а ваши группы были бы приблизительно 1000 в размере – они были бы на самом деле размером 1010; при условии, что все они будут одинакового размера, что может сделать их более релевантными друг другу с точки зрения любого анализа сравнения, который вы делаете.

Вы можете получить размер вашей группы просто

 DECLARE @ntile int SET @ntile = (SELECT count(1) from myTable) / 1000 

И затем, изменив подход @ Yuck с подстановкой NTILE ():

 ;WITH myCTE AS ( SELECT NTILE(@ntile) OVER (ORDER BY id) myGroup, col1, col2, ... FROM dbo.myTable ) SELECT myGroup, col1, col2... FROM myCTE GROUP BY (myGroup), col1, col2... ; 

Дайте ответ Yuck. Я отправляю только сообщение, чтобы включить блок кода. Я проверил счет, чтобы посмотреть, группируется ли он на 1000, а первый набор – 999. Это создало заданные размеры 1000. Отличный запрос Yuck.

  WITH T AS ( SELECT RANK() OVER (ORDER BY sID) Rank, sID FROM docSVsys ) SELECT (Rank-1) / 1000 GroupID, count(sID) FROM T GROUP BY ((Rank-1) / 1000) order by GroupID 
Давайте будем гением компьютера.