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