按列分区的 RANK 记录(Vertica SQL)

RANK records partitioned by a column in series (Vertica SQL)

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

下方产生输出
select when_created, status
from tablea

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

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

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

有没有一种方法可以使用 RANK 函数来完成此操作,或者是否有另一种方法可以在 vertica 中完成此操作 sql?

谢谢, 本

这是一个间隙和孤岛问题,其中棘手的部分是确定要用于 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() 计算 - 并观察您感兴趣的组的差异是恒定的。