【问题标题】:RANK records partitioned by a column in series (Vertica SQL)按列分区的 RANK 记录 (Vertica SQL)
【发布时间】:2016-11-13 18:23:52
【问题描述】:

我正在尝试使用 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 中有其他方法吗?

谢谢, 本

【问题讨论】:

    标签: sql vertica


    【解决方案1】:

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

    【讨论】:

    • 哇,真聪明!非常感谢
    • 非常感谢@GordonLinoff。我来寻找相同的逻辑并得到它。谢谢!!!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-14
    • 2015-01-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多