【问题标题】:How can I update rows obtained by a SELECT query in PostgreSQL with Python? Python 2.7 psycopg2如何使用 Python 更新 PostgreSQL 中的 SELECT 查询获得的行? Python 2.7 psycopg2
【发布时间】:2018-01-20 03:06:05
【问题描述】:

我有以下代码来计算表中特定行的值:

cursor.execute("SELECT * FROM restaurants WHERE license_type_code='20' ORDER BY general_score DESC;")
group_size = cursor.rowcount
for record in cursor:
   index = cursor.rownumber
   percentile = 100*(index - 0.5)/group_size
   print percentile

我需要做的是将percentile 结果添加到我通过SELECT 查询获得的每条记录的相应列score_percentile 中。

我想过这样一个UPDATE 查询:

 cursor.execute("UPDATE restaurants SET score_percentile="+str(percentile)+" WHERE license_type_code IN (SELECT * FROM restaurants WHERE license_type_code='20' ORDER BY general_score DESC)")

但我不知道该查询是否正确,或者是否有更有效且不那么愚蠢的方法来做到这一点(我相信必须有)。 你能帮帮我吗?

我是 SQL 新手,因此非常感谢任何帮助或建议。 谢谢!

【问题讨论】:

    标签: python sql postgresql python-2.7 psycopg2


    【解决方案1】:

    您根本不需要循环。只有一个更新查询

    cursor.execute("UPDATE restaurants SET score_percentile = 100*(rownumber - 0.5)/group_size  FROM (SELECT COUNT (*) as group_size FROM restaurants WHERE license_type_code='20') as t WHERE restaurants.license_type_code='20'")
    

    【讨论】:

    • 虽然你的查询语法不起作用,但你给了我如何解决它的见解。谢谢!
    【解决方案2】:

    正如 Thomas 所说,我只需要使用以下语法的更新查询:

    cursor.execute("UPDATE restaurants f SET score_percentile = ROUND(100*(f2.rownumber - 0.5)/"+str(group_size)+",3) FROM (SELECT f2.*,row_number() OVER (ORDER BY general_score DESC) as rownumber FROM restaurants f2 WHERE license_type_code='20') f2 WHERE f.license_type_code='20' AND f2.license_number=f.license_number;")
    

    我通过以下方式获得了group_size

    cursor.execute("SELECT COUNT(*) FROM restaurants WHERE license_type_code='20'")
    group_size = cursor.fetchone()
    group_size = group_size[0]
    

    这非常适合我的情况

    【讨论】:

      猜你喜欢
      • 2020-02-27
      • 1970-01-01
      • 2010-11-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-10-24
      相关资源
      最近更新 更多