NTILE SQL函数的动态参数

时间:2016-09-01 19:20:10

标签: sql sql-server

我正在尝试使用NTILE()为一组项目提供分组ID。基本上,每4个项目应与相同的GroupID组合在一起。问题是每个id的总行数不同。这可能吗?

SELECT
ProductDescription AS LabelType1,
NTILE(FLOOR(COUNT(bc.Groupings) / 4)) OVER (ORDER BY s.OrderId) AS GroupNumber,
Barcode AS Barcode1
FROM 
dbo.table1 s
INNER JOIN
#BoxCounts bc ON s.OrderId = bc.OrderId

1 个答案:

答案 0 :(得分:0)

这是Ben Thul评论的详细说明(因为他没有回答这个问题)。

NTILE()将一组行划分为 n 几乎相等大小的组。 n 是常量。

您希望将分组ID分配给固定数量的行。这是一个不同的问题,可以使用row_number()rank()轻松处理。

所以,一种方法是:

SELECT ProductDescription AS LabelType1,
       (ROW_NUMBER() OVER (ORDER BY s.OrderId) - 1) / 4 as GroupNumber,
       Barcode AS Barcode1
FROM dbo.table1 s INNER JOIN
     #BoxCounts bc
     ON s.OrderId = bc.OrderId;

请注意计算中的- 1,因此第一组有四个元素。此外,SQL Server进行整数除法,因此您不必担心额外的小数位。

如果您可以建立联系并希望所有具有相同OrderId的行位于同一组中,则使用dense_rank()(如果您希望所有组都有四个不同的订单ID)或{{ 1}}(如果您希望所有组都有大约四个订单ID)。