这很难表述,所以我只举一个例子,欢迎你编辑我的问题和标题。
假设我有一张桌子
flag id value datetime
0 b 1 343 13
1 a 1 23 12
2 b 1 21 11
3 b 1 32 10
4 c 2 43 11
5 d 2 43 10
6 d 2 32 9
7 c 2 1 8
对于,每个 id
,我想按flag
列对表进行调整,以便所有重复的flag
值都按照彼此的顺序折叠成一行,并进行sum
聚合。期望结果
flag id value
0 b 1 343
1 a 1 23
2 b 1 53
3 c 2 75
4 d 2 32
5 c 2 1
P.S:我找到了像CONDITIONAL_CHANGE_EVENT
这样的函数,它们似乎能够做到这一点,但是它们在文档中的例子对我不起作用
发布于 2017-08-22 18:34:46
使用不同的行号方法,根据连续的行标志是相同的来分配组。然后,使用一个运行的和。
select distinct id,flag,sum(value) over(partition by id,grp) as finalvalue
from (
select t.*,row_number() over(partition by id order by datetime)-row_number() over(partition by id,flag order by datetime) as grp
from tbl t
) t
发布于 2017-08-23 06:19:16
下面是一种使用CONDITIONAL_CHANGE_EVENT的方法:
select
flag,
id,
sum(value) value
from (
select
conditional_change_event(flag) over (order by datetime desc) part,
flag,
id,
value
from so
) t
group by part, flag, id
order by part;
由于order by datetime
的原因,结果与问题中所述的预期结果不同。为行号添加一个单独的列,并对其进行排序,从而得到正确的结果。
https://stackoverflow.com/questions/45824306
复制相似问题