python-3.x - 如何以有效的方式使用 Python 自动化 SQL 代码
问题描述
我有一个如下所示的 sql 代码: 数据库:RedShift
WITH
X as
(
SELECT distinct pn , pg , ic, sr , cm, fq , m1 , m2 , m3 , m4
FROM table1 ORDER BY 1,2,3
),
table2 AS
(
Select g,p,t , avg(ss) as ss , avg(ce) as ce , sum(av) as ps
from
(
select distinct ic AS g , pn AS p , cm AS t , ss , cast((sum_m1/nullif(sum_m2,0)) as decimal(3,2)) as
ce , av
from
(
select *
, cast((sum(m3) over (partition by ic, pn,cm)) as decimal) as ss
, sum(m1) over (partition by ic, pn,cm) as sum_m1
, sum(m2) over (partition by ic, pn,cm) as sum_m2
, cast((avg(m2) over (partition by ic, pn,cm)) as decimal) as av
from X
ORDER BY 1,2,3
)
order by 1,2,3
)
where ss is not null
group by 1,2,3
order by 1,2,3
)
按值分组g,p,t
每次都会更改,因此它为每个新的g,p,t
值组合创建表。
自动化的一种方法是在 Python 中转储此 sql 代码,这可能效率低下:这是我的方法->我用{}
大括号替换列表中的所有值示例说:
我将所有可能的分组值存储在一个列表中。
G=[g1,g2,g3]
P=[p1,p2,p3]
T=[t1,t2,t3]
连接到数据库:
c= psycopg2.connect(database=db,host=host,port=port,user=user,password=password,sslmode='require')
data2={}
for g in G:
for p in P:
for t in T:
sqlstr=( """ WITH
X as
(
SELECT distinct pn , pg , ic, sr , cm, fq , m1 , m2 , m3 , m4
FROM table1 ORDER BY 1,2,3
),
table2 AS
Select {},{},{} , avg(ss) as ss , avg(ce) as ce , sum(av) as ps
from
(
select distinct ic AS g , pn AS p , cm AS t , ss , cast((sum_m1/nullif(sum_m2,0)) as decimal(3,2)) as
ce , av
from
(
select *
, cast((sum(m3) over (partition by ic, pn,cm)) as decimal) as ss
, sum(m1) over (partition by ic, pn,cm) as sum_m1
, sum(m2) over (partition by ic, pn,cm) as sum_m2
, cast((avg(m2) over (partition by ic, pn,cm)) as decimal) as av
from X
ORDER BY 1,2,3
)
order by 1,2,3
)
where ss is not null
group by 1,2,3
order by 1,2,3
), select * from table2 """).format(g,p,t)
data2[g+"_"+p+"_"+t] = pd.read_sql_query(sqlstr, c)
有没有更好的方法来传递参数,如上面的 {} 代码序列应该保持按顺序传递参数?
我们可以使用 SQL 以外的其他方法吗?以pythonic方式?
解决方案
推荐阅读
- ios - 在 iOS coredata 的表中包含唯一性约束的新列时出错
- css - 仅限 Safari,div 背景图像悬停效果失去边框半径
- reporting-services - 我们可以在 SSRS 电子邮件订阅页面中禁用“包含报告”选项吗?
- php - 当我尝试从数据库中获取并显示逗号分隔值时,Explode 正在显示数组
- javascript - Firebase 和 JavaScript:从实时数据库更新网站上获取的数据,而无需重新加载网站
- ruby - 在对象初始化时在 ruby 中动态构建访问器
- visual-studio-2019 - 在 Visual Studio 2019 和 dotnetbrowser 中停止活动窗格穿透并激活其后面的对象的触摸手势
- android - 如何以编程方式实现谷歌位置自动完成并获得 kotlin 的 latlng?
- autodesk-forge - 如何强制设计自动化打开分离模型?
- java - Maven为python3 ANTLR语法文件生成python代码