按列分区的 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()
计算 - 并观察您感兴趣的组的差异是恒定的。
我正在尝试使用 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()
计算 - 并观察您感兴趣的组的差异是恒定的。