替代sql rank()over(partition by ... order by ..)

时间:2015-07-29 16:39:15

标签: sql

我正在尝试分配下面示例中的排名( rowFinal ),其中行按 GalleryId 进行分区,并按 StartDateKey排序上升。但是,我需要一个新的' EventName 使用StartdateKey 20131219重新启动计数,如下例所示。

GalleryId   StartDateKey    row EventName   rowFinal    
425934233   20130226         1    Renew        1    
425934233   20130326         2    Renew        2    
425934233   20130426         3    Renew        3    
425934233   20130526         4    Renew        4    
425934233   20130626         5    Renew        5     
425934233   20131219         6    New          1    
425934233   20140119         7    Renew        2    
425934233   20140219         8    Renew        3    
425934233   20140319         9    Renew        4    
425934233   20140419         10   Renew        5    
…                   
425931351   20121210         1    Renew        1    
425931351   20130110         2    Renew        2    
425931351   20130210         3    Renew        3    
425931351   20130310         4    Renew        4    
425931351   20130410         5    Renew        5    
425931351   20130510         6    Renew        6    
425931351   20130610         7    Renew        7    
425931351   20130710         8    Renew        8    
425931351   20130810         9    Renew        9    

由于速度的原因,解析和更新每一行(而循环)被证明是不实际的。任何建议都将深表赞赏。

3 个答案:

答案 0 :(得分:1)

你可以用一招来做到这一点。我们的想法是根据" New"的数量对行进行分组。记录在它之前。然后你可以使用累积总和来做到这一点:

select t.*,
       row_number() over (partition by GalleryId, numRenew order by startdatekey) as rowFinal
from (select t.*,
             sum(case when EventName = 'Renew' then 1 else 0 end) over 
                 (partition by partition by GalleryId order by startdatekey) as numRenew
      from table t
     ) t;

答案 1 :(得分:0)

尝试将不同的部分分成不同的查询并将它们组合在一起。

答案 2 :(得分:0)

select *, 
row_number() over(partition by galleryid,substring(startdatekey,7,2) order by startdatekey)
as rowFinal
from tablename;

看起来你在galleryid上分区,也在startdatekey的最后2个字符上分区。