如何根据查询中的值增加 SQL select 语句中的值

How do I increment a value within an SQL select statement based on values within the query

如果我在 postgres 12.4 数据库中有一个像这样定义的 table

id,name,age,enters,exits

其中 table 可以有多个同名条目。

我想创建一个 select 语句,在结果中引入一个 group_id 列。 group_id 将根据退出列的值递增。如果它包含 null,则 group_id 需要递增,后续行将属于新的 group_id,直到遇到下一个 exits=null。

例如,如果信息 table 包含:

id, name, age, enters, exits
1, orange, 10, null, 8
2, orange, 8, 3, 5
3, orange, 4, 9, null
4, orange, 11, null, 5
5, orange, 3, 3, null
6, lemon, 9, 1, 2

然后 select * 类型查询将 return this:

id, group_id, name, age, enters, exits
1, 1, orange, 10, null, 8
2, 1, orange, 8, 3, 5
3, 1, orange, 4, 9, null
4, 2, orange, 11, null, 5
5, 2, orange, 3, 3, null
6, 3, lemon, 9, 1, 2

我对 SQL 比较陌生,经过大量搜索和尝试后,我没有取得任何进展。那里的大多数示例都比这复杂得多,我对它们的理解还不足以将它们解构为有效的东西。

感谢任何帮助或指点。

您可以使用 window 函数来执行此操作,方法是计算前几行中出现的 null 个值:

select t.*,
    1 + count(*) filter(where exits is null) over(
        order by id
        rows between unbounded preceding and 1 preceding
    ) as group_id
from mytable t

Demo on DB Fiddle:

id | name   | age | enters | exits | group_id
-: | :----- | --: | -----: | ----: | -------:
 1 | orange |  10 |   null |     8 |        1
 2 | orange |   8 |      3 |     5 |        1
 3 | orange |   4 |      9 |  null |        1
 4 | orange |  11 |   null |     5 |        2
 5 | orange |   3 |      3 |  null |        2
 6 | lemon  |   9 |      1 |     2 |        3

或者:

select t.*,
    1 - (exits is null)::int + count(*) filter(where exits is null) over(order by id) as group_id
from mytable t