有条件地重置row_number

时间:2016-08-04 16:03:19

标签: sql postgresql

我想计算按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

我尝试了很多疑问,但没有什么能达到我的期望。

你能帮我解决这个问题吗? 谢谢你的帮助。

1 个答案:

答案 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