Sql 如何使用带有2列的行号设置相同的序列号

Sql 如何使用带有2列的行号设置相同的序列号,sql,sql-server,Sql,Sql Server,我有下面的表和值,我希望在预期输出中的输出如下 declare @TestData table (ID int, sku char(6), product varchar(15)) insert into @TestData values (1 , 'ABDE01' ,'SPA') insert into @TestData values (2 , 'ABDE01' ,'GRE') insert into @TestData values (3 , 'ABDE01'

我有下面的表和值,我希望在预期输出中的输出如下

declare @TestData table (ID int, sku char(6), product varchar(15))
insert into @TestData values (1 ,  'ABDE01'      ,'SPA')
insert into @TestData values (2 ,  'ABDE01'      ,'GRE')
insert into @TestData values (3 ,  'ABDE01'      ,'RUS')
insert into @TestData values (2 ,  'ABAD03'      ,'SPA')
insert into @TestData values (4 ,  'ABAD03'      ,'SPA')
insert into @TestData values (6 ,  'ABAD03'      ,'SPA')
insert into @TestData values (1 ,  'ABAD02'      ,'SPA')
insert into @TestData values (2 ,  'ABAD02'      ,'SPA')
insert into @TestData values (4 ,  'ABAD05'      ,'ENG')
预期产出如下:

SKU Product NewRow
ABAD02  SPA 1
ABAD02  SPA 1
ABAD02  ENG 2
ABAD03  SPA 1
ABAD03  SPA 1
ABAD03  SPA 1
ABDE01  SPA 1
ABDE01  GRE 2
ABDE01  RUS 3
我尝试了下面的查询,但它没有按预期工作,它给了我不同于我想要的结果

declare @TestData table (ID int, sku char(6), product varchar(15))
insert into @TestData values (1 ,  'ABDE01'      ,'SPA')
insert into @TestData values (2 ,  'ABDE01'      ,'GRE')
insert into @TestData values (3 ,  'ABDE01'      ,'RUS')
insert into @TestData values (2 ,  'ABAD03'      ,'SPA')
insert into @TestData values (4 ,  'ABAD03'      ,'SPA')
insert into @TestData values (6 ,  'ABAD03'      ,'SPA')
insert into @TestData values (1 ,  'ABAD02'      ,'SPA')
insert into @TestData values (2 ,  'ABAD02'      ,'SPA')
insert into @TestData values (4 ,  'ABAD02'      ,'ENG')


SELECT
    dt.SKU, dt.Product,  NewRow
    FROM (SELECT
               SKU, Product, --ROW_NUMBER() OVER (PARTITION BY product ORDER BY product) AS RowID,
               DENSE_RANK() OVER (PARTITION BY sku,product ORDER BY id) as NewRow 
              FROM @TestData              
         ) AS dt
但我得到的结果如下:

SKU Product NewRow
ABAD02  ENG 1
ABAD02  SPA 1
ABAD02  SPA 2
ABAD03  SPA 1
ABAD03  SPA 2
ABAD03  SPA 3
ABDE01  GRE 1
ABDE01  RUS 1
ABDE01  SPA 1
请告诉我我错过了什么。谢谢

您不需要分区依据,只需要顺序依据:

如果您只希望sku/产品组合具有不同的值,则不需要子查询:

SELECT dt.SKU, dt.Product,  
       DENSE_RANK() OVER (ORDER BY dt.SKU) as NewRow 
FROM @TestData td;

是否可能有以下样本数据

    insert into @TestData values (1 ,  'ABAD02'      ,'SPA')
    insert into @TestData values (5 ,  'ABAD02'      ,'SPA')
    insert into @TestData values (4 ,  'ABAD02'      ,'ENG')
在上述情况下,如何确定SPA和ENG之间的排序

例如,如果您有一个产品排序定义列表,则最好处理新行

     declare @TestData table (ID int, sku char(6), product varchar(15))
    insert into @TestData values (1 ,  'ABDE01'      ,'SPA')
    insert into @TestData values (2 ,  'ABDE01'      ,'GRE')
    insert into @TestData values (3 ,  'ABDE01'      ,'RUS')
    insert into @TestData values (2 ,  'ABAD03'      ,'SPA')
    insert into @TestData values (4 ,  'ABAD03'      ,'SPA')
    insert into @TestData values (6 ,  'ABAD03'      ,'SPA')
    insert into @TestData values (1 ,  'ABAD02'      ,'SPA')
    insert into @TestData values (2 ,  'ABAD02'      ,'SPA')
    insert into @TestData values (4 ,  'ABAD02'      ,'ENG')

    SELECT *,DENSE_RANK() OVER ( PARTITION BY sku ORDER BY x.sort) as NewRow  
    FROM @TestData AS t
    -- definating the sort of product
    INNER JOIN (VALUES(1,'SPA'),(2,'GRE'),(3,'ENG'),(4,'RUS')) x(sort,prd) ON x.prd=t.product
    ORDER BY t.sku,t.ID

使用窗口函数最接近预期输出的是按sku分区和按产品订购:

SELECT *
, NewRow = DENSE_RANK()OVER(PARTITION BY sku ORDER BY product)
FROM @TestData
ORDER BY sku, ID

但是,您的预期输出似乎按ID进一步排序,如果不拆分分组,窗口功能将无法处理这一点。光标循环可能是与预期输出完全匹配的唯一方法。

我要感谢大家的回答,并感谢大家抽出时间。不需要最终排序,查询正在按预期工作: ID sku product sort prd NewRow ----------- ------ --------------- ----------- ---- -------------------- 1 ABAD02 SPA 1 SPA 1 2 ABAD02 SPA 1 SPA 1 4 ABAD02 ENG 3 ENG 2 2 ABAD03 SPA 1 SPA 1 4 ABAD03 SPA 1 SPA 1 6 ABAD03 SPA 1 SPA 1 1 ABDE01 SPA 1 SPA 1 2 ABDE01 GRE 2 GRE 2 3 ABDE01 RUS 4 RUS 3
SELECT *
, NewRow = DENSE_RANK()OVER(PARTITION BY sku ORDER BY product)
FROM @TestData
ORDER BY sku, ID