使用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 
     )