【问题标题】:SQL ranking repeating groupsSQL 排名重复组
【发布时间】:2016-02-12 12:07:48
【问题描述】:

我有以下按开始日期排序的数据。我想要做的是对产品名称进行排名,例如产品编号 27675 位于第 1 行,第一次发现此产品时排名第 1...此产品再次位于第 5 行,因此排名第 2。

然后我想选择不带日期和按部分、行、产品和排名分组的数据。

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

更新----

使用以下内容:

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)上的产品相同的情况下,我希望这些具有相同的排名。

【问题讨论】:

  • 编辑了所需的排名列
  • 为什么第 2,3,4 行的排名应该是 1?

标签: sql ranking


【解决方案1】:

这实际上与您的其他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 语句中。

【讨论】:

    【解决方案2】:

    需要更正分区中的排序。

    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;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-05-30
      • 2018-01-11
      • 1970-01-01
      • 2023-01-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多