【问题标题】:What is the best way to calculate with two different and independent tables?使用两个不同且独立的表格进行计算的最佳方法是什么?
【发布时间】:2015-09-14 02:00:18
【问题描述】:

我有两个不同的表位于两个独立的数据库中,我正在尝试找出进行某些计算的最佳方法。

第一个表包含列:站点(varchar 256)、网站流量(整数)、站点类型(varchar 256)。第二个表包含:站点 (varchar 256)、每月成本 (float)、站点类型 (varchar 256)。

到目前为止,我已经有了查询结果,但是对于如何进行实际分析感到困惑,这基本上包括乘以网站流量和每月费用(一个简化的例子),同时使用网站和网站类型作为键

现在,如果它们是同一个数据库上的两个不同的表,我可以只做一个简单的连接,然后就可以愉快地工作了。然而,这是不可能的。因此,我想知道处理这个问题的最 Pythonic 方式是什么。

我的头脑风暴包括将第一个查询导出为 csv,然后在第二个数据库中创建一个临时表并在那里进行分析。如果有更好的方法在 python 中完成工作,请告诉我。

我的代码:

import pyodbc

conn = pyodbc.connect(r'DRIVER={SQL Server Native Client 11.0};SERVER=xyx;DATABASE=xxy;UID=xyx;PWD=xyx')

cursor = conn.cursor()

cursor.execute("select * from sites;")

rows = cursor.fetchall()

with open('file.txt' , 'w') as f:
    for row in rows:
        csv.writer(f).writerows(row)

cursor.close()
del cursor
conn.close()

conn = pyodbc.connect(driver='{Vertica}', server='blah', database='yys', port=5433, 
    uid='zzx', pwd='zzx')

cursor = conn.cursor()

cursor.execute("select * from table1;")

with open('otherfile.txt' , 'w') as f:
    for row in rows:
        csv.writer(f).writerows(row)

cursor.close()
del cursor
conn.close()

【问题讨论】:

  • 你能从第一个 SQL Server 链接到第二个 SQL Server 吗?如果是这样,那么您可以暂时将第二个表复制到第一个 SQL Server 中,然后执行 Join。
  • 很遗憾,我不能,这就是问题的原因。

标签: python sql-server algorithm pyodbc vertica


【解决方案1】:

考虑使用 Python 的数据分析包 pandas,它可以将 SQL 数据库中的查询读入数据帧。然后通过唯一字段合并两个数据框,或者如果列在名称中对齐,则连接两个数据框。

此外,您可以运行其他复杂的分析(即groupbypivot_table)并输出带有to_csvto_sql 的数据框作为SQL 数据库中的新表。

import pandas as pd
import pyodbc

# FIRST DATA FRAME      
conn = pyodbc.connect(r'DRIVER={SQL Server Native Client 11.0};\                      
                        SERVER=xyx;DATABASE=xxy;UID=xyx;PWD=xyx')
ssqlsite_df = pd.read_sql("select * from sites;", conn)
conn.close()

# SECOND DATA FRAME
conn = pyodbc.connect(driver='{Vertica}', server='blah', \
                      database='yys', port=5433, uid='zzx', pwd='zzx')
vertsite_df = pd.read_sql("select * from table1;", conn)
conn.close()

# MERGE DATA FRAMES
finaldf = merge(ssqlsite_df, vertsite_df, on=['SiteName', 'TypeOfSite'])

# CONCATENATE/STACK DATA FRAMES 
# (ASSUMING COLUMNS ARE SAME NAME, ADJUST IN QUERY FIELD ALIASES)
finaldf = concat([ssqlsite_df, vertsite_df], axis=0)  

print(finaldf.head(10))    # FIRST TEN ROWS

# DATA ANALYSIS
# CALCULATED COLUMN
finaldf['SiteCost'] = finaldf['WebsiteTraffic'].convert_objects(convert_numeric=True) * \
                      finaldf['MonthlyCost'].convert_objects(convert_numeric=True)     
... 

# OUTPUT DATA FRAME
# CREATES NEW TABLE IF PERMISSION GRANTED. BE SURE TO RE-OPEN CONNECTION.
# finaldf.to_sql('SiteAnalysis', conn)  

finaldf.to_csv('C:\\Path\\To\\SiteAnalysis.csv')

【讨论】:

    猜你喜欢
    • 2017-06-14
    • 2016-07-10
    • 2020-09-27
    • 1970-01-01
    • 2012-05-30
    • 1970-01-01
    • 1970-01-01
    • 2017-01-11
    • 2010-09-15
    相关资源
    最近更新 更多