使用sql查询/plpgsql在sql中对给定范围进行顺序分组
我需要按顺序将给定组范围的值分组使用sql查询/plpgsql在sql中对给定范围进行顺序分组,sql,postgresql,Sql,Postgresql,我需要按顺序将给定组范围的值分组 +----+--------+ | id | values | +----+--------+ | 1 | 8| | 2 | 9| | 3 | 10| | 4 | 11| | 5 | 12| | 6 | 16| | 7 | 17| | 8 | 1| | 9 | 7| | 10 | 9| | 11 | 18| | 12 |
+----+--------+
| id | values |
+----+--------+
| 1 | 8|
| 2 | 9|
| 3 | 10|
| 4 | 11|
| 5 | 12|
| 6 | 16|
| 7 | 17|
| 8 | 1|
| 9 | 7|
| 10 | 9|
| 11 | 18|
| 12 | 19|
+----+--------+
例如:
下表是我需要根据给定的
组范围
+----+--------+
| id | values |
+----+--------+
| 1 | 8|
| 2 | 9|
| 3 | 10|
| 4 | 11|
| 5 | 12|
| 6 | 16|
| 7 | 17|
| 8 | 1|
| 9 | 7|
| 10 | 9|
| 11 | 18|
| 12 | 19|
+----+--------+
组范围:
Group-1: [0-5]
Group-2: [6-10]
Group-3: [11-15]
Group-4: [16-20]
分组后需要以下输出(仅通过使用查询):
如何使用SQL查询/plpgsql而不进行任何循环?您可以为buil You group使用子选择,然后使用聚合函数和分组方式
select my_group, mix(values), max(values), avg(values)
from (
select case when value >= 0 and <= 5 then 'Group 1'
when value >= 6 and <= 10 then 'Group 2'
when value >= 11 and <= 15 then 'Group 3'
when value >= 16 and <= 20 then 'Group 4' end my_group,
values
from my_table
) t
group by my_group
选择我的组、混合(值)、最大(值)、平均(值)
从(
选择case when value>=0和=6和=11和=16,并且您可以分配组,这是一个间隙和孤岛问题:
with t as (
select t.*,
(case when value >= 0 and value <= 5 then 'Group 1'
when value >= 6 and value <= 10 then 'Group 2'
when value >= 11 and value <= 15 then 'Group 3'
when value >= 16 and value <= 20 then 'Group 4'
end) as grp
from t
)
select row_number() over (order by min(id)) as new_id,
grp, min(value), max(value), avg(value)
from (select t.*,
row_number() over (order by id) as seqnum,
row_number() over (partition by grp order by id) as seqnum_g
from t
) t
group by (seqnum - seqnum_g), grp;
这实际上是用于什么RDBMS的?您已经标记了sql server
和postgresql
。而且plsql
在sql server上不起作用;sql server使用t-sql。@Lamu很抱歉我不知道有错误的标记。@Gordon Linoff感谢您编辑这些标记。我需要获取组中的第一个和最后一个值。如何获取这些值?
with t as (
select t.*,
(case when value <= 5 then 'Group 1'
when value <= 10 then 'Group 2'
when value <= 15 then 'Group 3'
else 'Group 4'
end) as grp
from my_table
)