gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-29 11:07:15 25 4
gpt4 key购买 nike

我有一个通过 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com