我在PostgreSQL中遇到INSERT问题。我有这个问题:
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时,我得到了正确的对,但是当我在上面的语句中使用它时,有些是以错误的方式配对或根本不配对。这就是我的意思:
仅答案 0 :(得分:2)
DISTINCT ON (pga.gdid)
可以从具有相同pga.gdid
的集合中选择任何行。即使多次执行相同的查询,您也可以获得不同的结果。添加其他排序以获得一致的结果。类似于:pga.gdid ASC, pgb.gdid ASC
BTW您可能希望按pga.gdid ASC, pgb.timestamp - pga.timestamp ASC
订购以获得&#34; next&#34;点。
BTW2使用lead()
或lag()
窗口函数来计算当前行与下一行/上一行之间的差异可能更容易。这样你就不需要自我加入,并且可能会获得更好的表现。
答案 1 :(得分:1)
您只通过列pga.gdid订购查询结果,该列在所有行中都是相同的,因此每次执行选择查询时,postgres将以不同的方式对结果进行排序。