分组行集和 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
语句的形式(因此不可使用)。我用原始数据做了努力,但我没有对新数据重复这个过程。
我需要按某些标准(区域)对第 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
语句的形式(因此不可使用)。我用原始数据做了努力,但我没有对新数据重复这个过程。