gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 21:00:51 28 4
gpt4 key购买 nike

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

关于sql - 按系列列分区的 RANK 记录 (Vertica SQL),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38313142/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com