分组行集和 SQL 服务器中每个集的 Assigning/Updating 唯一编号

Grouping Set of Rows and Assigning/Updating Unique number to each set in SQL Server

我需要按某些标准(区域)对第 n(可配置)行(包)进行分组,然后 assign/update 每个组都有一个唯一标识符,该标识符绝不能重复 table (Shipping_Bags).

目前我的 table 中有几个空字段 (UserDef1/2..),我可以在其中 update/populate UniqueGroupID 值。 目前我的数据如下: 已经 delivered/shipped 的包具有 UniqueGroupID,以类似的方式我们需要更新 UniqueGroupID 以供将来交付,因此通过过滤 UniqueGroupID,系统可以找到与其关联的 4 个包。因此要求唯一性。

Select BagId, Zone, UserDef1, ShipDate from Shipping_Bag;

BagID     Zone           UserDef1     ShipDate
1         East              1        24/04/2018
2         East              1        24/04/2018
3         East              1        24/04/2018
4         East              1        24/04/2018
5         East              2        24/04/2018
6         East              2        24/04/2018
7         East              2        24/04/2018
8         West              3        25/04/2018
9         West              3        25/04/2018
10        North             4        25/04/2018
11        North             0        27/04/2018
12        North             0        27/04/2018
13        North             0        27/04/2018
14        North             0        27/04/2018
15        Central           0        27/04/2018
16        Central           0        27/04/2018
17        Central           0        27/04/2018
18        Central           0        27/04/2018
19        Central           0        27/04/2018

我想实现以下输出(每个区域分组 4 个包):

Select BagId, Zone, UserDef1 as UniqueGroupID, ShipDate from Shipping_Bag;

   BagID     Zone      UniqueGroupID     ShipDate
    1         East              1        24/04/2018
    2         East              1        24/04/2018
    3         East              1        24/04/2018
    4         East              1        24/04/2018
    5         East              2        24/04/2018
    6         East              2        24/04/2018
    7         East              2        24/04/2018
    8         West              3        25/04/2018
    9         West              3        25/04/2018
    10        North             4        25/04/2018
    11        North             5        27/04/2018
    12        North             5        27/04/2018
    13        North             5        27/04/2018
    14        North             5        27/04/2018
    15        Central           6        27/04/2018
    16        Central           6        27/04/2018
    17        Central           6        27/04/2018
    18        Central           6        27/04/2018
    19        Central           7        27/04/2018

我尝试并得到了输出:

select BagID,区域, --每4包计算组数,自增1 ceiling(row_number() over(partition by zone order by BagID) / 4.0) UniqueGroupID 来自 shipping_bag

这里的挑战是;我需要为 update/populate UniqueGroupID 提出 NextUp Number 逻辑,因此以后绝不能为任何 BagID 重复。

这将为您提供我们所拥有的示例数据所需要的结果:

USE Sandbox;
GO

CREATE TABLE Shipping (BagID int, [Zone] varchar(5), UserDef int);

INSERT INTO Shipping
VALUES (1,'East',0),
       (2,'East',0),
       (3,'East',0),
       (4,'East',0),
       (5,'East',0),
       (6,'East',0),
       (7,'East',0),
       (8,'West',0),
       (9,'West',0),
       (10,'North',0),
       (11,'North',0),
       (12,'North',0),
       (13,'North',0),
       (14,'North',0);
GO
DECLARE @BagSize int = 4;

WITH RNs AS(
    SELECT *,
           ROW_NUMBER() OVER (ORDER BY BagID) AS RN,
           ROW_NUMBER() OVER (PARTITION BY [Zone] ORDER BY BagID) AS BagRN
    FROM Shipping)
SELECT BagID,
       [Zone],
       DENSE_RANK() OVER (ORDER BY (RN - BagRN) + ((BagRN -1) / @BagSize)) AS UniqueGroupID
FROM RNs
ORDER BY BagID;

GO
DROP TABLE Shipping;
GO

编辑:好的,当您已有数据时,也许这可以满足您的需求:

USE Sandbox;
GO

CREATE TABLE Shipping (BagID int, [Zone] varchar(5), UserDef int);

INSERT INTO Shipping
VALUES (1,'East',1),
       (2,'East',1),
       (3,'East',1),
       (4,'East',1),
       (5,'East',2),
       (6,'East',2),
       (7,'East',3),
       (8,'West',4),
       (9,'West',4),
       (10,'North',0),
       (11,'North',0),
       (12,'North',0),
       (13,'North',0),
       (14,'North',0);
GO
DECLARE @BagSize int = 4;

WITH RNs AS(
    SELECT *,
           ROW_NUMBER() OVER (ORDER BY BagID) AS RN,
           ROW_NUMBER() OVER (PARTITION BY [Zone] ORDER BY BagID) AS BagRN,
           CASE UserDef WHEN 0 THEN 0 ELSE 1 END AS UserDefBit,
           MAX(UserDef) OVER () AS MaxUserDef
    FROM Shipping)
SELECT BagID,
       [Zone],
       CASE UserDef WHEN 0 THEN DENSE_RANK() OVER (PARTITION BY UserDefBit ORDER BY (RN - BagRN) + ((BagRN -1) / @BagSize)) + MaxUserDef
                    ELSE UserDef END AS UniqueGroupID
FROM RNs
ORDER BY BagID;

GO
DROP TABLE Shipping;
GO

注意:我还没有尝试使用 OP 的新示例数据,因为它不是 INSERT 语句的形式(因此不可使用)。我用原始数据做了努力,但我没有对新数据重复这个过程。