2016-02-11 35 views
0

此刻,我按產品名稱對SQL進行了排序,並按開始日期排序。我現在想做的是逐組,排,風格(我想結束與4行2行風格27823)這就是爲什麼我試圖包括一個排名,所以我可以通過也分組.. ..但它明顯地給了27823款式1的等級,所以我仍然得到3排。SQL分組問題 - 相同樣式代碼的倍數

SELECT 
    PS.SECTION_NAME [Planning Group], 
    PR.ROW_NAME [Planning Row], 
    P.PRODUCT_NAME [Style], 
    (SD.START_DATE) [Start dt], 
    dense_rank() OVER (ORDER BY P.PRODUCT_NAME) rank_ 

FROM 
    tables_ 

Order by 
    PS.SECTION_NAME, 
    PR.ROW_NAME, 
    SD.START_DATE 

我有什麼:

Group Row  Style Start dt  rank_ 
SEW  LS-1-A 27823 2015-12-12  1 
SEW  LS-1-A A8AR  2015-12-13  2 
SEW  LS-1-A NFJ3BH03 2016-01-06  3 
SEW  LS-1-A 27823 2016-02-17  1 
SEW  LS-1-A 27823 2016-03-03  1 
SEW  LS-1-A 27823 2016-03-12  1 
SEW  LS-1-A 27823 2016-03-20  1 
SEW  LS-1-A 27823 2016-03-24  1 

我想獲得的「NEW_RANK_COLUMN」通過在這樣我就可以組工作。

Group Row  Style Start dt  rank_ NEW_RANK_COLUMN 
SEW  LS-1-A 27823 2015-12-12  1  1 
SEW  LS-1-A A8AR  2015-12-13  2  2 
SEW  LS-1-A NFJ3BH03 2016-01-06  3  3 
SEW  LS-1-A 27823 2016-02-17  1  4 
SEW  LS-1-A 27823 2016-03-03  1  4 
SEW  LS-1-A 27823 2016-03-12  1  4 
SEW  LS-1-A 27823 2016-03-20  1  4 
SEW  LS-1-A 27823 2016-03-24  1  4 

我想要得到的結果是:

Group Row  Style  
SEW LS-1-A 27823  
SEW LS-1-A A8AR  
SEW LS-1-A NFJ3BH03 
SEW LS-1-A 27823  

回答

2

你要定義級別時採取的日期考慮 - 保持連續的值相同。一種方法是使用lag()看到當值更改,然後取該值的累計總和:

SELECT PS.SECTION_NAME [Planning Group], PR.ROW_NAME as [Planning Row], 
     P.PRODUCT_NAME [Style], (SD.START_DATE) as [Start dt], 
     SUM(isChange) OVER (PARTITION BY group ORDER BY start_dt) as rank_ 
FROM (SELECT t.*, 
      (CASE WHEN lag(row) over (partition by group order by start_dt) = row 
        THEN 0 
        ELSE 1 
       END) as IsChange 
     FROM tables_ t 
    ) t 
Order by PS.SECTION_NAME, PR.ROW_NAME, SD.START_DATE; 

這些功能在SQL Server 2012+工作。在早期版本中,您可以使用outer apply做類似的事情。

+0

鑑於樣本數據只有1組和1行,因此在分區上不清楚。很好的答案 – Paparazzi