SQLite技术问询:如何为每个Symbol查询10条升序数据
解决SQLite中每个Symbol取前10条数据的问题
要实现每个sym按t升序取前10条数据,你可以利用SQLite的窗口函数ROW_NUMBER()来分组编号,再筛选符合条件的行,具体方案如下:
核心思路
- 使用
ROW_NUMBER() OVER (PARTITION BY sym ORDER BY t ASC)给每个sym分组内的行按t升序分配序号 - 外层查询筛选序号≤10的行,确保每个
sym最多返回10条数据
代码实现
基于现有字符串拼接方式(适合静态/可信sym列表)
# syms列表会随新数据的导入和处理动态变更,此处为静态示例参考 syms = "'O:SPY230118P00392000','O:SPY230118C00398000'" query = """ SELECT * FROM ( SELECT *, ROW_NUMBER() OVER (PARTITION BY sym ORDER BY t ASC) AS row_num FROM data WHERE sym IN ({}) ) AS ranked_data WHERE row_num <= 10; """.format(syms) df = pd.read_sql(query, connectionDB)
参数化查询方式(更安全,避免SQL注入风险)
如果syms来自动态输入或不可信来源,建议使用参数化查询:
sym_list = ['O:SPY230118P00392000', 'O:SPY230118C00398000'] # 生成对应数量的占位符 placeholders = ', '.join(['?'] * len(sym_list)) query = """ SELECT * FROM ( SELECT *, ROW_NUMBER() OVER (PARTITION BY sym ORDER BY t ASC) AS row_num FROM data WHERE sym IN ({}) ) AS ranked_data WHERE row_num <= 10; """.format(placeholders) df = pd.read_sql(query, connectionDB, params=sym_list)
效果说明
执行后得到的df中,每个sym会保留按t升序排列的前10条数据,后续你可以正常使用groupby.get_group(symbol)进行分组处理。
内容的提问来源于stack exchange,提问作者CyberDEV
相关产品推荐
相关产品推荐

