我有一个很大的PostgreSQL表,可以通过Django访问。因为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/

10-10 16:47