按T-SQL中的每N条记录分组

Ahm*_*gle 17 sql t-sql sql-server

我在数据库上有一些性能测试结果,我想要做的是对每1000条记录进行分组(之前按日期按升序排序),然后用AVG汇总结果.

我实际上正在寻找一个标准的SQL解决方案,但是任何特定于T-SQL的结果也会受到赞赏.

Yuc*_*uck 23

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)
;
Run Code Online (Sandbox Code Playgroud)

这样的事情应该让你开始.如果您可以提供实际架构,我可以根据需要进行更新.


pap*_*zzo 8

给出Yuck的答案.我只发布一个答案,所以我可以包含一个代码块.我做了一个计数测试,看看它是否按1000分组,第一组是999.这样产生的设置大小为1,000.好查询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 
Run Code Online (Sandbox Code Playgroud)


Cha*_*ins 7

我给@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
Run Code Online (Sandbox Code Playgroud)

然后使用NTILE()替换修改@Yuck的方法:

;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...
;
Run Code Online (Sandbox Code Playgroud)