我想用case条件配置row_number。查看"time_diffs"列一下,检查一下,如果1是一个接一个的,那么它是一组,数字应该在前面的1之后重复。如果有0,那么每个0都是一组,数字不会重复-在每一个0之后,它会以+1的方式增长。当迭代器遇到新的1时,在0之间进行操作后,它不会重置计数。它将继续计数,0之后+1,但使用上面描述的逻辑。
下面列出的查询和结果示例。
select session_id,
player_id,
country,
start_time,
end_time,
case when timestampdiff(minute,
lag(end_time, 1) over(partition by player_id order by end_time)
, start_time) < 5 then 1
when timestampdiff(minute, end_time
, lead(start_time, 1) over(partition by player_id order by start_time)) < 5 then 1
else 0
end as time_diffs
/* , here is a new code with an expected result */
from game_sessions
where 1=1
and player_id = 1
order by player_id, start_time
当前查询的结果:
不能让ROW_NUMBER不为ROW_NUMBER。但是您可以使用SUM() OVER ()
来累计计数。
那么,首先为"this is start of a new group"创建一个标志。(距上一行超过5分钟),并按顺序汇总。
(我删除了时间差列,因为它是过度设计的,并且在当前形式中不需要。)
WITH
diffs AS
(
select
session_id,
player_id,
country,
start_time,
end_time,
/* here is a new code with an expected result */
LAG(end_time)
OVER (
PARTITION BY player_id
ORDER BY start_time
)
AS prev_end_time
from
game_sessions
)
SELECT
*,
SUM(
IF(start_time < prev_end_time + INTERVAL '5' MINUTE, 0, 1)
)
OVER (
PARTITION BY player_id
ORDER BY start_time
)
AS expected_result
FROM
diffs
WHERE
1=1
AND player_id = 1
ORDER BY
player_id,
start_time
演示:https://dbfiddle.uk/sJcWInTN
(注意,对于将来的问题,请使用ISO-8601标准符号表示日期和时间,这使得将数据插入表中更容易,更可靠等)