2017-02-04 28 views
0

我有以下表和價值觀,我想下面的產量預期輸出如何設置使用行號相同的序列號與2列

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 

請告知我在這裏錯過了什麼。謝謝!!

+0

我想感謝所有的答案,並感謝您的時間。最終排序不是必需的,查詢按預期工作。 :) –

回答

1

你不想PARTITION BY,只有ORDER BY

SELECT dt.SKU, dt.Product, 
     DENSE_RANK() OVER (ORDER BY min_id) as NewRow 
FROM (SELECT td.*, 
      MIN(td.id) OVER (PARTITION BY sku, product) as min_id 
     FROM @TestData td 
    ) td; 

如果你只是想在SKU /產品組合有不同的值,在你不需要的子查詢:

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

是否有可能有以下樣本數據?

insert into @TestData values (1 , 'ABAD02'  ,'SPA') 
    insert into @TestData values (5 , 'ABAD02'  ,'SPA') 
    insert into @TestData values (4 , 'ABAD02'  ,'ENG') 

在上述情況下,如何確定SPA和ENG的區別?

如果您有產品排序定義列表,將會更好地處理NewRow,例如。

 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 
 
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 
0

你可以使用一個窗口函數的期望輸出最接近的是SKU和訂單按產品劃分:

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

但是,您預計輸出出現的進一步命令ID,這不是窗口函數在不拆分分組的情況下處理的內容。遊標循環可能是唯一正確匹配預期輸出的方法。