计算postgresql中已排序子组的数量

时间:2013-09-17 18:45:40

标签: sql postgresql

我想计算下表中已排序子组的数量:

id  nmb
1   11
2   12
3   13
4   22
5   23
6   31
7   32
8   33
9   11
10  12
11  13
12  12
13  13
14  21
15  22
16  11
17  12
18  13
19  14

想在postgresql 8.4中获得类似的东西:

id  nmb local  
1   11  1  
2   12  1  
3   13  1  
4   22  1  
5   23  1  
6   31  1  
7   32  1  
8   33  1  
9   11  2  
10  12  2  
11  13  2  
12  12  3  
13  13  3  
14  21  3  
15  22  3  
16  11  4  
17  12  4  
18  13  4  
19  14  4 

编辑:“本地”专栏的最后几个数字是错误的。校正!

谢谢。

3 个答案:

答案 0 :(得分:2)

我虽然终于理解了你想要的东西,但却在不断增长价值观:

select id, nmb,
   sum(flag)
   over (order by id
         rows unbounded preceding) as local
from
 (
   select
      id, nmb,
      case
        when lag(nmb) 
             over (order by id) < nmb
          then 0 
        else 1
      end as flag
   from t
 ) as dt
order by id

但是第4组不适合

编辑:现在它们适合: - )

答案 1 :(得分:1)

SQL Fiddle

select
    id, nmb,
    row_number() over(partition by nmb order by id)
from t
order by id

答案 2 :(得分:1)

您似乎正在尝试枚举组,其中组的起始值nmb低于上一行(“{1}}订单定义的”上一个“。

我们的想法是使用id来确定群组的开头。然后获取累积总和以获得所需的组标识符:

lag()