PostgreSQL中仅针对特定行的有序排名

2vuwiymt  于 6个月前  发布在  PostgreSQL
关注(0)|答案(1)|浏览(75)

我在PostgreSQL上,我试图找到一个可以解决我的问题的查询。
这就是我所需要的:

|COL1|COL2|COL3|RANK
| A  | G  | V2 | NULL
| A  | B  | V1 | 1
| A  | C  | V1 | 1
| A  | D  | V1 | 1
| A  | D  | V2 | NULL
| A  | E  | V1 | 2

字符串
简而言之,对于按COL 1-COL 2排序的连续行,我需要得到COL 3 = V1的有序RANK。
我想使用**LAG()**函数来检查下一行,然后比较当前行和下一行之间的COL 3值,如下所示:

SELECT *, lag(COL3) over(partition by COL1 order by COL1, COL2) as COL_CHECK
FROM table


我真的不明白该如何管理它,因为当COL 3 = V2时,我需要RANK列NULL,而当COL 3 = V1时,我需要增加RANK。
谢谢

vlurs2pr

vlurs2pr1#

如果存在确保确定性排序的唯一列(例如主键),这里有一个使用两个行号之间的差异的解决方案:

select *, case when col3 = 'V1'
               then row_number() over (partition by COL1 order by id) -
                    row_number() over (partition by COL1, COL3 order by id)
               else null 
          end as rnk
from mytable
order by id

字符串
Demo here

相关问题