SQL分组问题 - 相同样式代码的倍数

时间:2016-02-11 16:40:22

标签: sql sql-server

目前,我按产品名称排列了SQL,并按开始日期排序。我现在要做的是按组,行,样式分组(我希望最终得到4行,样式27823有2行)这就是为什么我试图包含一个等级,所以我也可以按此分组..但它显然,27823风格的等级为1,所以我仍然得到3行。

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    

1 个答案:

答案 0 :(得分: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执行类似操作。