首页 > 解决方案 > 在 SQL Server 中,如何对表中匹配的数据集进行编号?

问题描述

鉴于下面显示的一组数据,我需要能够根据&列optionGroupNumber中的值推导出右侧的值。因此,对于 Order 1,为详细信息键 1 和 2 选择的选项相同(绿色阴影),因此它们的值为 1。详细信息键 3(蓝色阴影)与 1 和 2 具有不同的选项集,因此它得到2 作为它的.optionTypeoptionValueoptionGroupoptionGroupNumber

Optionvalues由用户任意输入,因此它们可以是任何东西。

如何使用 T-SQL 来做到这一点?

在此处输入图像描述

标签: sqlsql-servertsql

解决方案


这个要求很难理解,所以我会根据这个来回答:

鉴于下面显示的一组数据,我需要能够根据 optionType 和 optionValue 列中的值推导出右侧 optionGroupNumber 中的值。

假设我们有一张带有动物和颜色的表格,我们想根据相同类型和颜色的动物创建一个组号。我们会像这样使用 RANK() 来做到这一点:

-- sample data
DECLARE @sometable TABLE (someId int identity, pet varchar(20), color varchar(20));
INSERT @sometable (pet, color)
VALUES ('cat','blue'),('pig','green'),('cat','yellow'),('pig','green'),('cat','yellow'),
('cat','blue'),('dog','black'),('dog','white'),('pig','green'),('dog','black');

-- group by pet and color
SELECT *, OptionGroupNumber = DENSE_RANK() OVER (ORDER BY pet, color)
FROM @sometable;

结果:

someId      pet                  color                OptionGroupNumber
----------- -------------------- -------------------- --------------------
1           cat                  blue                 1
6           cat                  blue                 1
3           cat                  yellow               2
5           cat                  yellow               2
10          dog                  black                3
7           dog                  black                3
8           dog                  white                4
9           pig                  green                5
4           pig                  green                5
2           pig                  green                5

请注意分组的工作原理:

在此处输入图像描述

要更新和现有列,您将采用此逻辑并将其应用于 UPDATE 语句,如下所示:

-- sample data
DECLARE @sometable TABLE 
  (someId int identity, pet varchar(20), color varchar(20), OptionGroupNumber int);

INSERT @sometable (pet, color)
VALUES ('cat','blue'),('pig','green'),('cat','yellow'),('pig','green'),('cat','yellow'),
('cat','blue'),('dog','black'),('dog','white'),('pig','green'),('dog','black');

WITH generateOptionGroupNumber AS
(
  SELECT *, newOptionGroupNumber = DENSE_RANK() OVER (ORDER BY pet, color)
  FROM @sometable
)
UPDATE generateOptionGroupNumber
SET OptionGroupNumber = newOptionGroupNumber

SELECT * 
FROM @sometable
ORDER BY OptionGroupNumber;

推荐阅读