我想计算按ID分组的行,并按时间值排序,如row_number() over(partition by id order by time)
。但是当我遇到特殊情况时,我想重置行数。
例如,在下表中,当event = 'y'
我希望从1重新计算相同的ID时。
id time event rank
----------- ------------------------- ---------- ----------
400 2016-07-09 11:31:30 y 1
400 2016-07-09 11:31:31 x 2
400 2016-07-09 11:31:37 x 3
400 2016-07-09 11:31:38 x 4
400 2016-07-09 11:31:42 y 1
400 2016-07-09 11:31:43 x 2
400 2016-07-09 11:31:44 x 3
400 2016-07-09 11:31:59 y 1
400 2016-07-09 11:32:43 x 2
400 2016-07-09 11:33:44 x 3
401 2016-07-09 10:31:30 y 1
401 2016-07-09 10:31:31 x 2
401 2016-07-09 10:37:37 x 3
401 2016-07-09 10:38:38 x 4
401 2016-07-09 11:05:42 y 1
401 2016-07-09 11:07:43 x 2
401 2016-07-09 11:31:44 x 3
我尝试了很多疑问,但没有什么能达到我的期望。
你能帮我解决这个问题吗? 谢谢你的帮助。答案 0 :(得分:2)
您可以使用条件累积和来进一步按event
字段对行进行分区:
with cte as (
select id, time, event,
sum(case when event = 'y' then 1 else 0 end) over (partition by id order by time) as group_id
from tbl
)
select id, time, event,
row_number() over (partition by id, group_id order by time) as rank
from cte