首页 > 解决方案 > 在 SQL 中查找事件之间的最小天数

问题描述

假设我有下表,对于每个玩家,我想知道玩 gameA和 game之间可能的最小差距(天数) B。请注意,顺序无关紧要(即,您可以 playA后接BORB后接A)。

播放器 日期 游戏
1 2021-01-01 一个
1 2021-01-02 一个
1 2021-01-08
1 2021-01-10 一个
2 2021-01-01 一个
2 2021-01-02
2 2021-01-03
2 2021-01-04 一个
2 2021-01-05 一个
2 2021-01-06 一个
2 2021-01-07 一个
2 2021-01-08
3 2021-01-01 一个
3 2021-01-05
3 2021-01-07
3 2021-01-07
3 2021-01-08
4 2021-01-01
4 2021-01-02
4 2021-01-04 一个
4 2021-01-07

因此,预期的输出将是:

播放器
1 2
2 1
3 4
4 2

我知道我需要执行一个group-byand order-by

SELECT DO_SOMETHING
FROM PLAY_TABLE
GROUP BY PLAYER
ORDER BY DATE

对于每个组,看起来我需要在DATE相邻行具有不同GAME值时获取差异,然后返回最小值,但我不清楚如何实现这一点。

标签: sqlgroup-bysql-order-byansi-sql

解决方案


最小的间隙将在相邻的行上,因此您可以使用lag().

select player, min(date - prev_date)
from (select t.*,
             lag(game) over (partition by player order by date) as prev_game,
             lag(date) over (partition by player order by date) as prev_date
      from t
     ) t
where prev_game = 'A' and game = 'B' or
      prev_game = 'B' and game = 'A'
group by player;

请注意,众所周知,日期/时间函数依赖于数据库,因此-可能无法在您的数据库中使用。


推荐阅读