Postgres - 基于连续值的排名

3
如何创建一个排名,在连续序列被打破时重新从1开始?
(点击下面的图片)
下表表示用户的流程。他的总旅程包括8个步骤,页面显示了他在每个步骤中所在的页面。我想创建一个排名,在页面更改时重置。棘手的部分是让排名在(第6步,第1页)重置为1而不是继续在4处。按页面分区是不够的,因为我希望排名在用户切换回页面1并继续时重新开始。表格包含了我想要实现的结果,我只是不知道如何在Postgres中实现这一点。

Table Rank


请复制/粘贴格式化文本 - 不要发布图像。同时,对于给定数据的预期结果示例比任何解释都更好。 - Vao Tsun
1个回答

5
您可以使用行数差的方法分配组,并使用 row_number() 分配排名:
select step, page,
       row_number() over (partition by page, seqnum - seqnum_p order by step) as ranking
from (select t.*,
             row_number() over (order by step) as seqnum,
             row_number() over (partition by page order by step) as seqnum_p
      from t
     ) t;

要理解为什么这样做有效,需要查看子查询的结果。您将看到两个seqnum值之间的差异如何识别具有相同值的连续行。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接