在PostgreSQL中使用窗口函数对表的列中重复值的长链进行编号

eivnm1vs  于 2023-06-29  发布在  PostgreSQL
关注(0)|答案(1)|浏览(122)

在PostgreSQL中,我有一个表,其中有一列长时间重复的0和1。我想创建另一个列,用重复的等级对这些进行排名。下面是我想看到的一个例子:
| 新栏目| New column |
| - -----| ------------ |
| 一个| 1 |
| 一个| 1 |
| 一个| 1 |
| 2| 2 |
| 2| 2 |
| 2| 2 |
| 2| 2 |
| 三个| 3 |
| 三个| 3 |
| 三个| 3 |
| 三个| 3 |
| 三个| 3 |
| 4| 4 |
| 4| 4 |
| 5个| 5 |
| 5个| 5 |
| 5个| 5 |
等等。带秩的表函数能否有效地用于此?或者这超出了窗口函数的能力?谢谢

dy2hfwbg

dy2hfwbg1#

可以使用窗口函数;我们可以用lag得到前一个值,然后计算值变化的窗口计数来定义每个记录所属的组。
当然,这需要一个列来对表进行排序,比如id

select id, col, 
  count(*) filter(where col is distinct from lag_col) over(order by id) grp
from (
    select t.*, lag(col) over(order by id) as lag_col
    from mytable t
) t
order by id

| 山坳|grp| grp |
| - -----|- -----| ------------ |
| 0|一个| 1 |
| 0|一个| 1 |
| 0|一个| 1 |
| 一个|2| 2 |
| 一个|2| 2 |
| 一个|2| 2 |
| 一个|2| 2 |
| 0|三个| 3 |
| 0|三个| 3 |
| 0|三个| 3 |
| 0|三个| 3 |
| 0|三个| 3 |
| 一个|4| 4 |
| 一个|4| 4 |
| 0| 5个| 5 |
| 0| 5个| 5 |
| 0| 5个| 5 |
fiddle

相关问题