Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/87.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
正在计算PostgreSQL中已排序子组的数目_Sql_Postgresql - Fatal编程技术网

正在计算PostgreSQL中已排序子组的数目

正在计算PostgreSQL中已排序子组的数目,sql,postgresql,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

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

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 
编辑:“本地”列的最后几个数字是错误的。更正

多谢各位


似乎您正在尝试枚举组,其中组的nmb值低于id顺序定义的前一行

这个想法是通过使用滞后来确定一个组的开始。然后获取累积总和以获取所需的组标识符:

select id, nmb, sum(StartFlag) over (order by id) as local
from (select id, nmb,
             lag(nmb) over (order by id) as lastnmb,
             (case when lag(nmb) over (order by id) < nmb then 0
                   else 1
              end) as StartFlag
      from t
     ) t
order by id;

似乎您正在尝试枚举组,其中组的nmb值低于id顺序定义的前一行

这个想法是通过使用滞后来确定一个组的开始。然后获取累积总和以获取所需的组标识符:

select id, nmb, sum(StartFlag) over (order by id) as local
from (select id, nmb,
             lag(nmb) over (order by id) as lastnmb,
             (case when lag(nmb) over (order by id) < nmb then 0
                   else 1
              end) as StartFlag
      from t
     ) t
order by id;

我想我终于明白了你想要什么,不断增长的价值观:

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
但第四组不适合


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

我想我终于明白你想要什么了,不断增长的价值观:

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
但第四组不适合


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

最后几个数字相差很远。@GigaWatt您的预期结果是错误的。检查一下。或者解释一下逻辑。最后几个数字相差很远。@GigaWatt您的预期结果是错误的。检查一下。或者解释一下逻辑。你能解释一下创建这些数字的规则吗?我不明白。你能解释一下创建这些数字的规则吗?我不明白。