如何获取一组连续的id

How to get a continuous group of id

对于只有 2 个值的属性的每个变体,我想按组增加一个 id。像这样:

1   banana
2   banana
3   egg
4   egg
5   banana
6   egg
7   egg

想要的结果

id   food    grp
1   banana    1
2   banana    1
3   egg       2
4   egg       2
5   banana    3
6   egg       4
7   egg       4

我用 window 函数尝试了 dense_rank() 但我只在 grp 列

中给了我 1 或 2

您可以使用window函数来解决这个间隙和孤岛问题。她是一个使用 lag() 和 window count():

的方法
select id, food, count(*) filter(where food is distinct from lag_food) over(order by id) grp
from (
    select t.*, lag(food) over(order by id) lag_food
    from mytable t
) t

逻辑是将每种食物与“上一”行的值进行比较,并计算它变化了多少次。

Demo on DB Fiddle:

id | food   | grp
-: | :----- | --:
 1 | banana |   1
 2 | banana |   1
 3 | egg    |   2
 4 | egg    |   2
 5 | banana |   3
 6 | egg    |   4
 7 | egg    |   4