遍历表,对每一行进行计算

加拿大海军

我想以说我对SQL还是很陌生的方式来开头,但是现在我的工作需要我参与其中。

我有一个包含地形点数据(x,y,z)的数据集。我正在尝试基于此数据构建KNN模型。对于每个点“ P”,我在数据集中最近的P(最近的意思是地理上最近的)中搜索100个点。然后,我将这些点的值取平均值(该平均值称为残差),并将此值添加到“残差”列中的表中。

作为概念验证,我试图简单地遍历表,并将每行中“ resid”列的值设置为1.0。

我的查询是这样的:

CREATE OR REPLACE FUNCTION LoopThroughTable() RETURNS VOID AS '
DECLARE row table%rowtype;
BEGIN
    FOR row in SELECT * FROM table LOOP
        SET row.resid = 1.0;
    END LOOP;
END

' LANGUAGE 'plpgsql';

SELECT LoopThroughTable() as output; 

这段代码将执行并成功返回,但是当我检查表时,没有进行任何更改。我怎么了

a_horse_with_no_name

循环进行逐行更新几乎总是一个坏主意,并且非常缓慢且无法扩展。您应该真正找到避免这种情况的方法。

说完之后:

您所做的所有功能就是更改内存中列值的值-您只是在修改变量的内容。如果要更新数据,则需要update声明:

您需要UPDATE在循环内部使用

CREATE OR REPLACE FUNCTION LoopThroughTable() 
  RETURNS VOID 
AS
$$
DECLARE 
   t_row the_table%rowtype;
BEGIN
    FOR t_row in SELECT * FROM the_table LOOP
        update the_table
            set resid = 1.0
        where pk_column = t_row.pk_column; --<<< !!! important !!!
    END LOOP;
END;
$$ 
LANGUAGE plpgsql;

请注意,您必须whereupdate语句的主键上添加一个条件,否则将为循环的每次迭代更新所有

稍微更有效的解决方案是使用一个光标,然后用做更新where current of

CREATE OR REPLACE FUNCTION LoopThroughTable() 
  RETURNS VOID 
AS $$
DECLARE 
   t_curs cursor for 
      select * from the_table;
   t_row the_table%rowtype;
BEGIN
    FOR t_row in t_curs LOOP
        update the_table
            set resid = 1.0
        where current of t_curs;
    END LOOP;
END;
$$ 
LANGUAGE plpgsql;

因此,如果在循环结束后执行UPDATE查询,是否会将更改提交到表中?

否。对该函数的调用在调用事务的上下文中运行。因此,如果在SQL客户端中禁用了自动提交,则需要commit在运行后执行SELECT LoopThroughTable()


请注意,语言名称是一个标识符,请勿在其周围使用单引号。您还应该避免使用诸如row变量名之类的关键字

使用美元引号(如我所做的)也使编写函数主体更加容易

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何对每一行进行计算

来自分类Dev

pyspark对其他行进行每一行计算并获得最大值

来自分类Dev

如何在python中对pandas数据帧的每一行进行计算?

来自分类Dev

如何遍历文件的每一行并将该文件的每一行与第二个文件的所有行进行匹配?

来自分类Dev

在Delphi TMemo中对每一行进行处理

来自分类Dev

对密码中的每一行进行拆分操作

来自分类Dev

对data.table的每一行进行回归

来自分类Dev

对df中的每一行进行操作

来自分类Dev

在Delphi TMemo中对每一行进行处理

来自分类Dev

逐行循环遍历文本文件内容并使用批处理文件对每一行进行操作

来自分类Dev

Perl:将文件的每一行与该文件的每一行进行比较

来自分类Dev

遍历每一行并与 PostgreSQL 中的表进行比较

来自分类Dev

仅一次将表中的每一行与其他行进行比较

来自分类Dev

查询表并与另一行进行比较

来自分类Dev

MySQL遍历每一行(大表)

来自分类Dev

遍历表值参数中的每一行

来自分类Dev

SQL LIKE是否会遍历表的每一行

来自分类Dev

如何将数据帧1的每一行与数据帧2的每一行进行比较?

来自分类Dev

如何将数据帧1的每一行与数据帧2的每一行进行比较?

来自分类Dev

计算oracle表中每一行的出现次数

来自分类Dev

如何从矩阵中选择每一行进行不同的操作

来自分类Dev

在两列之间分别对每一行进行排序

来自分类Dev

按列值对数据框中的每一行进行排序

来自分类Dev

numpy矩阵,通过对每一行进行排序将0设置为值

来自分类Dev

在R中,对两个匹配数据帧的每一行进行排序

来自分类Dev

弹簧数据:按条件对每一行进行排序

来自分类Dev

如何在CSV文件的每一行进行字计数?

来自分类Dev

每列对一行进行采样,并丢失大量数据

来自分类Dev

Python将文件中的每一行与其他所有行进行比较

Related 相关文章

  1. 1

    如何对每一行进行计算

  2. 2

    pyspark对其他行进行每一行计算并获得最大值

  3. 3

    如何在python中对pandas数据帧的每一行进行计算?

  4. 4

    如何遍历文件的每一行并将该文件的每一行与第二个文件的所有行进行匹配?

  5. 5

    在Delphi TMemo中对每一行进行处理

  6. 6

    对密码中的每一行进行拆分操作

  7. 7

    对data.table的每一行进行回归

  8. 8

    对df中的每一行进行操作

  9. 9

    在Delphi TMemo中对每一行进行处理

  10. 10

    逐行循环遍历文本文件内容并使用批处理文件对每一行进行操作

  11. 11

    Perl:将文件的每一行与该文件的每一行进行比较

  12. 12

    遍历每一行并与 PostgreSQL 中的表进行比较

  13. 13

    仅一次将表中的每一行与其他行进行比较

  14. 14

    查询表并与另一行进行比较

  15. 15

    MySQL遍历每一行(大表)

  16. 16

    遍历表值参数中的每一行

  17. 17

    SQL LIKE是否会遍历表的每一行

  18. 18

    如何将数据帧1的每一行与数据帧2的每一行进行比较?

  19. 19

    如何将数据帧1的每一行与数据帧2的每一行进行比较?

  20. 20

    计算oracle表中每一行的出现次数

  21. 21

    如何从矩阵中选择每一行进行不同的操作

  22. 22

    在两列之间分别对每一行进行排序

  23. 23

    按列值对数据框中的每一行进行排序

  24. 24

    numpy矩阵,通过对每一行进行排序将0设置为值

  25. 25

    在R中,对两个匹配数据帧的每一行进行排序

  26. 26

    弹簧数据:按条件对每一行进行排序

  27. 27

    如何在CSV文件的每一行进行字计数?

  28. 28

    每列对一行进行采样,并丢失大量数据

  29. 29

    Python将文件中的每一行与其他所有行进行比较

热门标签

归档