如何获取一组连续的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
逻辑是将每种食物与“上一”行的值进行比较,并计算它变化了多少次。
id | food | grp
-: | :----- | --:
1 | banana | 1
2 | banana | 1
3 | egg | 2
4 | egg | 2
5 | banana | 3
6 | egg | 4
7 | egg | 4
对于只有 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
逻辑是将每种食物与“上一”行的值进行比较,并计算它变化了多少次。
id | food | grp -: | :----- | --: 1 | banana | 1 2 | banana | 1 3 | egg | 2 4 | egg | 2 5 | banana | 3 6 | egg | 4 7 | egg | 4