You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于多列分组的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.16 07:53:24