基于时间的游戏最高分进阶SQLite查询需求
问题
给定存储游戏得分与对应时间戳的表格,需要编写SQLite查询语句,检索出每次达成时为历史最高分的得分及其对应时间(即最高分进阶记录)。要求仅返回指定日期内的这类记录。
参考样例数据(按时间戳排序,带*的为历史最高分记录):
| 得分 | 时间戳 | 备注 |
|---|---|---|
| 5* | 00:12 2022-08-09 | |
| 6* | 01:15 2022-08-09 | |
| 2 | 01:30 2022-08-09 | 逊于当前最高分6,无* |
| 10* | 02:01 2022-08-09 | |
| 7 | 03:45 2022-08-09 | 逊于当前最高分10 |
| 12* | 03:50 2022-08-09 | |
| 1* | 00:05 2022-08-10 | 注意日期不同! |
| 6* | 01:01 2022-08-10 |
例如查询2022-08-09时,预期输出:
| 最佳得分 | 时间戳 |
|---|---|
| 5 | 00:12 |
| 6 | 01:15 |
| 10 | 02:01 |
| 12 | 03:50 |
解决方案
假设表格名为game_scores,包含字段score(得分,整数类型)、timestamp(时间戳,字符串或DATETIME类型)。以下是SQLite方言的查询语句:
SELECT score AS 最佳得分, strftime('%H:%M', timestamp) AS 时间戳 FROM ( SELECT score, timestamp, MAX(score) OVER (ORDER BY timestamp ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) AS running_max FROM game_scores WHERE DATE(timestamp) = '2022-08-09' ) AS subquery WHERE score = running_max ORDER BY timestamp;
语句说明
- 内层子查询使用窗口函数
MAX() OVER (...)计算截止到当前记录的历史最高分(running_max),按时间戳顺序遍历指定日期的所有记录。 - 外层筛选出得分等于当前历史最高分的记录,这些就是每次刷新历史最高的进阶记录。
- 使用
strftime('%H:%M', timestamp)提取时间戳中的时分部分,匹配示例输出格式;若需保留完整日期,可直接使用timestamp字段。 - 修改
DATE(timestamp) = '指定日期'中的日期值,即可查询其他日期的进阶记录。
适配注意
如果你的timestamp字段存储格式与示例不同,需要调整DATE()和strftime()的参数以匹配实际格式,确保日期筛选和时间提取逻辑正确。
内容的提问来源于stack exchange,提问作者sil
相关产品推荐
相关产品推荐

