如果有这样一个表
ID VALUE1 VALUE2
1 china 25
2 china 23
3 usa 78
4 usa 75
5 china 40
6 china 30
我希望连续一段区间内进行汇总,得出这样一个结果china 48
usa 153
china 70因为china中间已经被Usa分割了,所以就要重新累计这样的需求应该怎样实现呢
ID VALUE1 VALUE2
1 china 25
2 china 23
3 usa 78
4 usa 75
5 china 40
6 china 30
我希望连续一段区间内进行汇总,得出这样一个结果china 48
usa 153
china 70因为china中间已经被Usa分割了,所以就要重新累计这样的需求应该怎样实现呢
from tb a
insert into tx select 'a',10
union all select 'a',20
union all select 'b',10
union all select 'a',20
union all select 'a',10;select * from tx;with cte as
(
select dr=DENSE_RANK() over(PARTITION by name order by id),rn=ROW_NUMBER() over(order by id),* from tx
)
select name,SUM(c) from cte group by rn-dr,name order by MIN(id)/*
name
---------- -----------
a 30
b 10
a 30(3 行受影响)
*/
(
select dr=DENSE_RANK() over(PARTITION by name order by id),rn=ROW_NUMBER() over(order by id),* from tx
)
select name,SUM(c) from cte group by rn-dr,name order by MIN(id)
没有看懂这条语句
#1. 先生成一个缓存的结果集(CTE). 增加2列: 一列是按name分组后,在组内生成连续的序号;一列是按id排序后,用row_number函数生成记录号
#2. 特别注意一下CTE生成的结果集,呵呵
#3. 按rn-dr分组,再按name分组,求出组内c字段的和,再以组内最小的id来排序
重点是在rn-dr,为什么这样分组没有问题呢?
呵呵,自己捉摸一下吧。看一下#2中的结果集。
from (
select
row_number() over(partition by value1 order by id)-id as rn,
value1,value2
from tb )l
group by value1,rn;
你在网上查下SQL 2005 的四个分组函数就知道了!