2016-03-11 77 views
0

我有PostgreSQL中的INSERT的問題。我有這個查詢: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時,我得到了正確的對,但是當我在上面的語句中使用它時,有些配對方式是錯誤的,或者根本不配對。這就是我的意思是: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語句完全相同,爲什麼它會給出不同的結果?

+2

順便說一句:與'WHERE sq.gdid2 IS NOT NULL;'有效變換LEFT加入到純加入。 – joop

+1

注2:'(pga.timestamp joop

+0

@joop哦,沒錯。我最初想要顯示空值,以查看最後一點是否正確無法連接到具有不同tid的下一個點。當我寫這篇文章時已經很晚了,忘記了JOIN。感謝您的更正! –

回答

2

DISTINCT ON (pga.gdid)可以挑任意排等於pga.gdid。即使通過多次執行相同的查詢,您也可以獲得不同的結果。添加額外的順序以獲得一致的結果。例如:pga.gdid ASC, pgb.gdid ASC

順便說一句您可能想要訂購pga.gdid ASC, pgb.timestamp - pga.timestamp ASC以獲得「下一個」點。

BTW2使用窗口函數lead()lag()可能更容易計算當前行與下一個/上一個之間的差異。這樣你就不需要自己加入,並且可能會獲得更好的性能。

+0

啊,是啊!這很有道理,我希望它能起作用。舊的查詢花了5秒,現在它已經在2分鐘和計數的額外訂單...... –

+2

「得到正確的結果」往往需要比「得到一些結果」更多的時間。 –

+0

@pfannkuchen_gesicht看到我的編輯可能獲得更好的表現。 –

1

你只列pga.gdid,這是所有行相同的排序查詢結果,所以Postgres將每次你做的選擇查詢時間順序以不同的方式的結果。

+0

你是什麼意思?該GDID是連續的,第一列是TID,第二和第三列是關於你的編輯gdids –

+0

:我不是被pga.tid訂購雖然。 –

+0

對不起,我在電話裏。我的意思是,如果您按一列排序,並且您的多個結果具有相同的值,那麼結果的順序每次都會有所不同。 – Castillo