删除重复的行并因此相互跟随
Delete rows, which are duplicated and follow each other consequently
很难表述,所以我只是举个例子,欢迎您编辑我的问题和标题。
假设,我有一个 table
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
对于 each id
我想通过 flag
列压缩 table 这样所有重复的 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
这样的函数似乎可以做到这一点,但文档中的示例不适用于我
使用行号差异方法根据连续行标志相同来分配组。此后使用 运行 总和。
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
这是一种使用 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
,结果与问题中您想要的结果不同。为行号添加一个单独的列并对其进行排序会给出正确的结果。
很难表述,所以我只是举个例子,欢迎您编辑我的问题和标题。
假设,我有一个 table
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
对于 each id
我想通过 flag
列压缩 table 这样所有重复的 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
这样的函数似乎可以做到这一点,但文档中的示例不适用于我
使用行号差异方法根据连续行标志相同来分配组。此后使用 运行 总和。
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
这是一种使用 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
,结果与问题中您想要的结果不同。为行号添加一个单独的列并对其进行排序会给出正确的结果。