正在计算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您的预期结果是错误的。检查一下。或者解释一下逻辑。你能解释一下创建这些数字的规则吗?我不明白。你能解释一下创建这些数字的规则吗?我不明白。