在字典上进行SQL循环查询

0 人关注

我有一个SQL查询,使用日历月的第一天和最后一天来生成一个特定月份的数据子集。我一直在试图找出如何对若干个月进行循环--我有两个列表(一个是第一天,另一个是最后一天),两个图元(相同),以及一个包含所有这些日期的字典(第一个和最后一个是键和值)--并将所有结果存储在一个数据框中,我正在挣扎得很厉害。

如果我只使用一个列表或元组,我可以做循环并获得所有的数据--然后我可以通过它循环并获得所有的数据。有什么办法能做到我想做的事吗?

fd=['2018-05-01','2018-06-01','2018-07-01']
ld=['2018-05-31','2018-06-30','2018-07-31']
my_dict=dict(zip(fd, ld))
data_check=pd.DataFrame()
fd_d=','.join(my_dict.keys())
ed_d=','.join(['%%(%s)s' % x for x in my_dict])
query= """
SELECT count(distinct ids),first_date, last_date  from table1
where first_date=%s and last_date =%s
group by 2,3
for x in my_dict:
    df=pd.read_sql(query% (fd_d,ed_d),my_dict)
    data_check=data_check.append(df)
    
1 个评论
添加--红移。 谢谢!
python
sql
loops
amazon-redshift
user11941538
user11941538
发布于 2019-08-18
1 个回答
Parfait
Parfait
发布于 2019-08-18
0 人赞同

一般来说,请注意三个最佳做法。

  • 避免在循环中使用 DataFrame.append 四次方拷贝 。取而代之的是,在循环外建立一个数据框架的列表,并将其串联起来。

  • 使用参数化,而不是使用pandas支持的字符串连接法。 read_sql .这就避免了对字符串格式和引号标点的需求。

  • 停止使用modulo运算符, % ,用于字符串连接,因为它已经 不再被强调 (没有被正式废弃)。取而代之的是使用优越的 str.format .

  • 具体来说,为了你的需要,使用 zip 在两个列表之间进行元素迭代,而不在字典中分层。

    query= """SELECT count(distinct ids), first_date, last_date 
              FROM table1 
              WHERE first_date = %s and last_date = %s 
              GROUP BY 2, 3""" 
    df_list = []
    for f, l in zip(fd, ld): 
       df = pd.read_sql(query, conn, params=[f, l]) 
       df_list.append(df)
    final_df = pd.concat(df_list)
    

    另外,通过在表中对每个月的第一天和最后一天进行汇总,可以避免循环和参数。

    query= """SELECT count(distinct ids), first_date, last_date 
              FROM table1 
              WHERE DATE_PART(d, first_date) = 1
                AND last_date = LAST_DAY(first_date)