Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/86.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 在update语句中使用窗口函数_Sql_Django_Postgresql_Window Functions - Fatal编程技术网

Sql 在update语句中使用窗口函数

Sql 在update语句中使用窗口函数,sql,django,postgresql,window-functions,Sql,Django,Postgresql,Window Functions,我有一个很大的PostgreSQL表,可以通过Django访问。因为Django的ORM不支持窗口函数,所以我需要将窗口函数的结果作为常规列烘焙到表中。我想这样做: UPDATE table_name SET col1 = ROW_NUMBER() OVER ( PARTITION BY col2 ORDER BY col3 ); 但我得到错误:无法在更新中使用窗口功能 有人能提出另一种方法吗?通过Django的.raw()方法传递窗口函数语法是不合适的,因为它返回一个RawQuer

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

UPDATE  table_name
SET     col1 = ROW_NUMBER() OVER ( PARTITION BY col2 ORDER BY col3 );
但我得到
错误:无法在更新中使用窗口功能

有人能提出另一种方法吗?通过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上测试过。以下是的语法(请参阅可选的fromlist)


希望这有帮助。

我认为您不需要自动加入?我很可能是错的,因为我是基于SQL Server中的工作原理@马丁:您正在选择两个表,一个是通过UPDATE
tablename
选择的,另一个是在
fromttablename
子句中选择的。如果不显式地加入,它将产生笛卡尔积。我可能错了。如果是,请纠正我。直接来自手册:来自列表:表表达式的列表,允许来自其他表的列显示在WHERE条件和update表达式中。这类似于可以在SELECT语句的FROM子句中指定的表列表。请注意,目标表不得出现在from_列表中,除非您打算进行自联接(在这种情况下,它必须在from_列表中以别名出现)。现在,我不得不收回我的话:(是的,postgres没有任何可更新视图。需要为可更新视图创建规则才能工作。我需要省略
表的名称。
语句中的
部分,但在其他方面效果很好。