我对PostgreSQL中的插入有问题。我有这样的疑问:

INSERT INTO track_segments(tid, gdid1, gdid2, distance, speed)
SELECT * FROM (
SELECT DISTINCT ON (pga.gdid)
pga.tid as ntid,
pga.gdid as gdid1, pgb.gdid as gdid2,
ST_Distance(pga.geopoint, pgb.geopoint) AS segdist,
(ST_Distance(pga.geopoint, pgb.geopoint) / EXTRACT(EPOCH FROM (pgb.timestamp - pga.timestamp + interval '0.1 second'))) as speed
FROM fl_pure_geodata AS pga
LEFT OUTER JOIN fl_pure_geodata AS pgb ON (pga.timestamp < pgb.timestamp AND pga.tid = pgb.tid)
ORDER BY pga.gdid ASC) AS sq
WHERE sq.gdid2 IS NOT NULL;

用成对连接的地质点分段填充表格。当我单独运行SELECT时,我得到了正确的对,但是当我在上面的语句中使用它时,有些对错了,或者根本没有。我的意思是:
单独选择的结果:
tid;gdid1;gdid2;distance;speed
"0f6fd522-5f1e-49a4-b85e-50f11ef7f908";10;11;34.105058803;31.0045989118182
"0f6fd522-5f1e-49a4-b85e-50f11ef7f908";11;12;90.099603143;14.7704267447541
"0f6fd522-5f1e-49a4-b85e-50f11ef7f908";12;13;23.331326565;21.2102968772727

使用相同选择插入后的结果:
tid;gdid1;gdid2;distance;speed
"0f6fd522-5f1e-49a4-b85e-50f11ef7f908";10;12;122.574;17.2639603638028
"0f6fd522-5f1e-49a4-b85e-50f11ef7f908";11;12;90.0996;14.7704267447541
"0f6fd522-5f1e-49a4-b85e-50f11ef7f908";12;13;23.3313;21.2102968772727

这是什么原因?它与INSERT的SELECT语句完全相同,为什么会给出不同的结果?

最佳答案

DISTINCT ON (pga.gdid)可以从具有相等pga.gdid的集合中选取任何行。即使多次执行同一查询,也可以得到不同的结果。添加额外的排序以获得一致的结果。比如:pga.gdid ASC, pgb.gdid ASC
顺便说一句,您可能希望通过pga.gdid ASC, pgb.timestamp - pga.timestamp ASC订购来获得“下一个”点。
BTW2使用lead()lag()窗口函数计算当前行与下一行/上一行之间的差异可能更容易。这样你就不需要自我加入,而且可能会得到更好的表现。

关于database - PostgreSQL插入的行与select不同,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/35943355/

10-09 21:17