如何根据查询中的值增加 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
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
如果我在 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
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