我正在尝试使用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
答案 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)。