Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/postgresql/10.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/api/5.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
Postgresql Postgres:查询结果不符合预期?_Postgresql_Subquery_Point Clouds - Fatal编程技术网

Postgresql Postgres:查询结果不符合预期?

Postgresql Postgres:查询结果不符合预期?,postgresql,subquery,point-clouds,Postgresql,Subquery,Point Clouds,我以前用C和VB写过,但这是我第一次使用Prostgres。我已经为我的申请工作了大约一个月,但遇到了一个困扰我大约一周的问题 我在一个名为xyzfloats的表中有大约7000行。每行包含3个浮点(x浮点、y浮点、z浮点)(以米为单位的点云表示))在最终版本中将有大约26亿行,因此我尝试使用子集来节省时间 我的另一个表xyztable4包含24000000行。每行为: xcell int,ycell int,points int,总浮点 前两个整数包含一个x,y索引。我通过使用带有交叉连接的g

我以前用C和VB写过,但这是我第一次使用Prostgres。我已经为我的申请工作了大约一个月,但遇到了一个困扰我大约一周的问题

我在一个名为xyzfloats的表中有大约7000行。每行包含3个浮点(x浮点、y浮点、z浮点)(以米为单位的点云表示))在最终版本中将有大约26亿行,因此我尝试使用子集来节省时间

我的另一个表xyztable4包含24000000行。每行为: xcell int,ycell int,points int,总浮点

前两个整数包含一个x,y索引。我通过使用带有交叉连接的generate_系列创建了它

create table xyztable4(

xcell int,
   ycell int,
   points int default 0,
   total float default 0
)

insert into xyztable4 (xcell, ycell) 

select from generate_series(-1000,6000) as xcell cross join generate_series(-40,3360) as ycell;
计划是将浮动台中的每个x,y放置在一个边长为0.05米的小正方形中

确定x和y的正确平方后,z将添加到“总计”列中,“点数”列将递增

代码如下:

with subquery as (
     select x,y,z
     from xyzfloats)
update xyztable4
set
   points=points+1,
   total = total + subquery.z
from subquery

where xcell= floor(subquery.x/0.05) and ycell = floor(subquery.y/0.05)
我尝试使用cast,但索引在负面方面是错误的

请给出正确的结果

问题是我只处理了234行,而不是7000行

我认为这可能是数字精度的问题,也就是说可能有一些训练数字表示它不完全是整数。我认为postgres使用的是整数除法,比如C

处理的行数(234)始终相同。它会向每个点列添加1。如果我再次运行查询,我在points列中得到2。因此,它一直是错误的


我已经进行了小规模的测试。(9行xyz)并且它工作得非常完美

由于
更新的方式,
查询没有达到您期望的效果。。。FROM…
在postgres中工作。以下是该网站的报价:

当存在FROM子句时,实际上发生的是将目标表连接到FROM_列表中提到的表,并且连接的每个输出行表示目标表的更新操作。使用FROM时,应确保联接为要修改的每一行最多生成一个输出行。换句话说,目标行不应连接到其他表中的多个行。如果这样做,那么只有一个连接行将用于更新目标行,但使用哪一个连接行并不容易预测。
由于这种不确定性,仅在子选择中引用其他表更安全,尽管通常比使用联接更难读取和更慢

您需要确保正在更新的表(
xyztable4
)与
FROM
子句中的表之间的联接在主表中每行生成一行。您可以这样做:

with subquery as (
     select 
       floor(x/0.05) xcell,
       floor(y/0.05) ycell,
       count(z) cnt,
       sum(z) total_z
     from xyzfloats
     group by 1, 2
)
update xyztable4 
set
   points=points + subquery.cnt,
   total = total + subquery.total_z
from subquery

where xyztable4.xcell = subquery.xcell and xyztable4.ycell = subquery.ycell

嗨,谢谢你的帮助和指导。现在正在填充50mm的正方形,但仍然只有234行从可能的7000行添加到xyztable4?哦..对不起,7000条记录已经完成,因为框中现在有多个条目。再次感谢你的帮助