Подтвердить что ты не робот

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

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

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

4b9b3361

Ответ 1

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)
;

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

Ответ 2

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...
;

Ответ 3

Дайте ответ 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