基于多列分组的SQL查询For循环实现及性能优化求助
解决SQL查询超时:按促销分组拆分查询并合并结果
核心做法
按Promo Name分组,每组用自身对应的Start_Date和该组的Key集合生成独立SQL,分批查询后合并所有结果到一个DataFrame里,避免用最早的Start_Date查全量Key导致超时。
具体步骤
1. 准备数据与参数
先把end_date设为最近周日(静态值),同时准备好你的原始DataFrame:
import pandas as pd from datetime import datetime, timedelta # 替换成你的实际数据 raw_df = pd.DataFrame({ 'Promo Name': ['促销A', '促销A', '促销A', '促销B', '促销B'], 'Key': [6565, 5555, 5455, 2222, 2333], 'Start_Date': ['4/10/2023', '4/10/2023', '4/10/2023', '5/10/2023', '5/10/2023'] }) # 设定结束日期为最近周日,这里直接用示例值,可按需计算 end_date = '7/9/2023'
2. 分组生成SQL并执行查询
遍历每个促销分组,提取该组的Key和Start_Date,生成SQL后执行查询,把结果存到列表里:
# 存储所有查询结果的容器 all_results = [] # 按促销名称分组遍历 for promo, group_data in raw_df.groupby('Promo Name'): # 把Key转成SQL IN子句需要的格式 key_list = ', '.join(map(str, group_data['Key'].unique())) # 获取该促销对应的开始日期(假设同一促销下Start_Date一致,取第一个即可) start_date = group_data['Start_Date'].iloc[0] # 拼SQL语句 sql_query = f""" SELECT * FROM TABLE WHERE KEY IN ({key_list}) AND TIME_KEY BETWEEN '{start_date}' AND '{end_date}' """ # 执行查询(替换成你的数据库连接方式,比如用pd.read_sql) # 示例:假设你有数据库连接conn # query_result = pd.read_sql(sql_query, conn) # all_results.append(query_result) # 打印SQL用于测试 print(sql_query)
3. 合并所有查询结果
把分批查询到的DataFrame合并成最终的结果:
# 合并所有结果,重置索引 final_result = pd.concat(all_results, ignore_index=True)
注意点
- 如果同一促销下有不同的Start_Date,需要按
Promo Name+Start_Date双重分组,改成raw_df.groupby(['Promo Name', 'Start_Date'])即可 - 要是单组Key数量太多,还可以在组内再拆分批次(比如每100个Key查一次),避免IN子句太长影响性能
- 数据库连接部分要换成你实际用的工具(比如SQLAlchemy、pymysql等)
内容的提问来源于stack exchange,提问作者temsandroses
相关产品推荐
相关产品推荐

