由列中的列分区的RANK记录(Vertica SQL)

时间:2016-07-11 17:48:29

标签: sql vertica

我尝试使用Vertica排名分析函数来创建按列分区的排名列,但只包含系列中的记录。例如,下面的查询产生查询

下面的输出
select 
when_created, status, rank() OVER (PARTITION BY status order by when_created) as rnk
from tablea

when_created    Status  rnk
1/1/2015    ACTIVE  1
3/1/2015    ACTIVE  2
4/1/2015    INACTIVE    1
4/6/2015    INACTIVE    2
6/7/2015    ACTIVE  3
10/9/2015   INACTIVE    3

我可以修改我的查询以包含一个产生以下输出的排名列

when_created    Status  rnk
1/1/2015    ACTIVE  1
3/1/2015    ACTIVE  2
4/1/2015    INACTIVE    1
4/6/2015    INACTIVE    2
6/7/2015    ACTIVE  1
10/9/2015   INACTIVE    1

然而,当一个系列被打破时,我的目标是从等级开始,所以期望的输出是:

{{1}}

有没有办法使用RANK函数完成此操作,还是有另一种方法在vertica sql中执行此操作?

谢谢, 本

1 个答案:

答案 0 :(得分:4)

这是一个间隙和岛屿问题,其中棘手的部分是识别用于row_number()计算的组。一种解决方案使用行号的差异来识别不同的组:

select a.*,
       row_number() over (partition by status, seqnum - seqnum_s order by when_created) as rnk
from (select a.*,
             row_number() over (order by when_created) as seqnum,
             row_number() over (partition by status order by when_created) as seqnum_s
      from tablea a
     ) a;

当你第一次看到它时,这背后的逻辑是棘手的。我建议你运行子查询并理解两个row_number()计算 - 并观察你感兴趣的组的差异是不变的。