sql - 在更新语句中使用窗口函数

标签 sql django postgresql window-functions

我有一个通过 Django 访问的大型 PostgreSQL 表。因为Django的ORM不支持窗口函数,所以我需要将一个窗口函数的结果作为一个常规列烘焙到表中。我想做这样的事情:

UPDATE  table_name
SET     col1 = ROW_NUMBER() OVER ( PARTITION BY col2 ORDER BY col3 );

但是我得到了ERROR: cannot use window function in UPDATE

谁能提出替代方法?通过 Django 的 .raw() 方法传递窗口函数语法是不合适的,因为它返回一个 RawQuerySet,它不支持我需要的更多 ORM 功能,例如 .filter()。

谢谢。

最佳答案

错误来自 postgres 而不是 django。您可以将其重写为:

WITH v_table_name AS
(
    SELECT row_number() over (partition by col2 order by col3) AS rn, primary_key
    FROM table_name
) 
UPDATE table_name set table_name.col1 = v_table_name.rn
FROM v_table_name
WHERE table_name.primary_key = v_table_name.primary_key;  

或者:

UPDATE table_name set table_name.col1 = v_table_name.rn
FROM  
(
    SELECT row_number() over (partition by col2 order by col3) AS rn, primary_key
    FROM table_name
) AS v_table_name
WHERE table_name.primary_key = v_table_name.primary_key;

这行得通。刚刚在 postgres-9.6 上测试过。这是 UPDATE 的语法(参见可选的 fromlist)。

希望这对您有所帮助。

关于sql - 在更新语句中使用窗口函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4358613/

相关文章:

php - 通过 SQL 注入(inject)从数据库中提取信息

javascript - Google Chrome 在大格式数据提交方面落后

sql - Postgresql 转储是否创建以最后一个键开头或之后的序列?

java - 使用 java.util.Date 输入的 Postgres 上的时间戳超出范围错误

postgresql - Postgresql 中的意外死锁(使用 psycopg2 时)

python - 比较两个名字和姓氏列表以找到匹配项

mysql - 如何使用 DATEDIFF() 返回添加后已超过 24 小时的行

javascript - Ajax POSTS不更新屏幕内容

python - ValueError at/url/ View frontend.views.url 没有返回 HttpResponse 对象。它返回 None 相反

mysql - 服务器上 django 的 syncdb 期间出错