sql - 在 SQL 中查找事件之间的最小天数
问题描述
假设我有下表,对于每个玩家,我想知道玩 gameA
和 game之间可能的最小差距(天数) B
。请注意,顺序无关紧要(即,您可以 playA
后接B
ORB
后接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-by
and order-by
:
SELECT DO_SOMETHING
FROM PLAY_TABLE
GROUP BY PLAYER
ORDER BY DATE
对于每个组,看起来我需要在DATE
相邻行具有不同GAME
值时获取差异,然后返回最小值,但我不清楚如何实现这一点。
解决方案
最小的间隙将在相邻的行上,因此您可以使用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;
请注意,众所周知,日期/时间函数依赖于数据库,因此-
可能无法在您的数据库中使用。
推荐阅读
- sapui5 - SAPUI5 Fragment close 清除上一屏的数据
- asp.net-mvc - 是否可以使 GlobalConfiguration.Configure 异步?
- excel - 根据另一个工作表中的单元格值隐藏一个工作表中的行
- vb.net - 如何在控制台中输出选项卡?
- r - knitr:针织代码的更好再现性
- sql - Oracle - JSON_OBJECT - ORA-40478:输出值太大(最大值:4000)
- python-3.x - 如何在 Python 中从 statsmodels.tsa.x13 生成季节性分量预测?
- java - 未从 Firebase 实时数据库获取数据
- python - Seaborn Lineplot 显示自定义中心线而不是平均值
- jquery - Jquery Ajax“参数字典包含参数的空条目”错误