我有一个事件结果表,我需要为给定的玩家列表获取每个玩家最近的n个事件.
这是在iOS上,所以它需要快速.我看过很多使用子查询或连接的top-n-group-group解决方案,但即使在macbook pro上,我的100k行数据集运行速度也很慢.到目前为止,我的愚蠢解决方案,因为我只运行最多6个玩家,是要做6个单独的查询.它不是非常慢,但必须有更好的方法,对吧?这是我现在正在做的事情的要点:
results_by_pid = {}
player_ids = [1,2,3,4,5,6]
n_results = 6
for pid in player_ids:
results_by_pid[pid] = exec_sql("SELECT *
FROM results
WHERE player_id = #{pid}
ORDER BY event_date DESC
LIMIT n_events")
然后我继续我的快乐方式.但是,如何将其转换为单个快速查询?
最佳答案 没有更好的方法.
可能有帮助的SQL窗口函数未在SQLite中实现.
SQLite被设计为嵌入式数据库,其中大部分逻辑保留在应用程序中.
与应避免网络通信的客户端/服务器数据库相比,混合SQL命令和程序逻辑没有性能劣势.
一个不那么愚蠢的解决方案要求你事先在某处做一些SELECT player_id FROM,这应该没问题.
要使单个查询有效,请确保在两列player_id和event_date上有一个索引.