2016-02-12 55 views
0

我有以下數據按開始日期排序。我想要做的是排名產品名稱,如出現例如產品號27675是第1行,並在第一次發現這個產品,因此排名1 ...再次這個產品是第5排排名2.SQL排名重複組

然後我想要選擇沒有日期和分組,按行,產品和排名的數據。

SECTION_NAME ROW_NAME PRODUCT NAME start_date   DESIRED RANK  
SEW    LS-1-A_1 27675   02/03/2016 14:39 1 
SEW    LS-1-A_1 26298   06/04/2016 16:56 1 
SEW    LS-1-A_1 26298   16/05/2016 16:56 1 
SEW    LS-1-A_1 26298   04/06/2016 09:26 1 
SEW    LS-1-A_1 27675   16/06/2016 16:22 2 
SEW    LS-1-A_1 18969   17/07/2016 12:54 1 
SEW    LS-1-A_1 26298   01/08/2016 10:52 2 
SEW    LS-1-A_1 27675   29/08/2016 08:38 3 
SEW    LS-1-A_1 LEVI F17 SMS 12/09/2016 13:39 1 

我生產秩爲:

SECTION_NAME ROW_NAME PRODUCT NAME start_date    RANK  
SEW    LS-1-A_1 27675   02/03/2016 14:39 1 
SEW    LS-1-A_1 26298   06/04/2016 16:56 1 
SEW    LS-1-A_1 26298   16/05/2016 16:56 2 
SEW    LS-1-A_1 26298   04/06/2016 09:26 3 
SEW    LS-1-A_1 27675   16/06/2016 16:22 2 
SEW    LS-1-A_1 18969   17/07/2016 12:54 1 
SEW    LS-1-A_1 26298   01/08/2016 10:52 4 
SEW    LS-1-A_1 27675   29/08/2016 08:38 3 
SEW    LS-1-A_1 LEVI F17 SMS 12/09/2016 13:39 1 


SELECT 
    SECTION_NAME, 
    ROW_NAME, 
    PRODUCT_NAME, 
    start_date, 
    dense_rank() OVER (PARTITION BY product_name ORDER BY START_DATE)RANK 
FROM 
    TABLES 

Order by 
    SECTION_NAME,ROW_NAME,START_DATE 

UPDATE ----

使用以下:

SELECT 
    SECTION_NAME , 
    ROW_NAME, 
    PRODUCT_NAME [Style], 
    (START_DATE) as [Start dt], 
    SUM(isChange) OVER (PARTITION BY SECTION_NAME , ROW_NAME,product_name  ORDER BY START_DATE) as rank_ 

FROM (SELECT SECTION_NAME, 
     ROW_NAME, 
     PRODUCT_NAME, 
     sd.START_DATE, 
     (CASE WHEN lag(PR.ROW_NAME) over (order by SD.START_DATE) = PR.ROW_NAME 
       THEN 0 
       ELSE 1 
      END) as IsChange 
    FROM 
    TABLES_t 
) t 
Order by SECTION_NAME, ROW_NAME, START_DATE; 

產生以下:(在情況下的產品每行都是一樣的(10,11,12),我期望它們有相同的排名

enter image description here

+0

編輯期望等級列 – Chris

+1

行2,3,4爲什麼要有1級? – vtuhtan

回答

0

需要通過校正分區中的順序。

SELECT 
SECTION_NAME , 
ROW_NAME, 
PRODUCT_NAME [Style], 
(START_DATE) , 
SUM(isChange) OVER (PARTITION BY ROW_NAME,product_name ORDER BY START_DATE) as rank_ 
,IsChange 
FROM (SELECT SECTION_NAME, 
     ROW_NAME, 
     PRODUCT_NAME, 
     sd.START_DATE, 
     (CASE WHEN lag(product_name) over (order by SECTION_NAME, ROW_NAME, sd.START_DATE) = product_name 
       THEN 0 
       ELSE 1 
      END) as IsChange 


    FROM 
    Table_ t 
) t 

Order by SECTION_NAME, ROW_NAME, START_DATE; 

enter image description here

2

這實際上與您的其他question類似。不同的是,計數需要重新開始,每個product_name。所以,這裏是一個方法:

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 product_name ORDER BY start_dt) as rank_ 
FROM (SELECT t.*, 
      (CASE WHEN lag(row) over (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; 

注意:這個問題在前面的一個,我不明白的SECTION_NAMEROW_NAME的作用。該版本忽略這些列。如果您希望查詢重新開始每個組中的編號,請將它們包含在partition by語句中。

+0

我已經更新了問題的結果 – Chris