0
我試圖創建一個參數查詢,該參數查詢將在使用plpgsql的循環中執行。使用Pl/pgSQL將參數傳遞給循環中的查詢
2參數將成爲傳遞到查詢中的起始緯度/經度點。緯度和經度點將從數組中檢索 - 所以它將成爲像遍歷數組一樣的foreach,並將每個執行的兩個緯度/經度值傳遞到查詢中。
我該怎麼做這樣的事情?
我的查詢和我認爲的實現方式如下所示:(X,Z值是將要傳遞的參數緯度/經度值,Y和T將通過執行一定的計算來獲得,我將處理)。爲了清楚起見,因爲它計算並返回請求落入小時間隔(時間戳)的數量我的查詢返回多列和多圓柱結果(時間戳和計數)
for each latitude-longitude pair X,Z in array
find Y and T from X and Z
WITH cal AS (
SELECT generate_series('2011-02-02 00:00:00'::timestamp ,
'2012-04-01 05:00:00'::timestamp ,
'1 hour'::interval) AS stamp
),
qqq AS (
SELECT date_trunc('hour', calltime) AS stamp, count(*) AS zcount
FROM mytable
WHERE calltime >= '2011-02-13 22:55:11'
AND calltime <= '2012-02-13 01:02:21'
AND (calltime::time >= '22:55:11'
OR calltime::time <= '01:02:21')
AND lat >= X
AND lat <= Y
AND lon >= Z
AND lon <= T
GROUP BY date_trunc('hour', calltime)
)
SELECT cal.stamp, COALESCE (qqq.zcount, 0) AS zcount
FROM cal
LEFT JOIN qqq ON cal.stamp = qqq.stamp
WHERE cal.stamp >= '2011-02-13 22:00:00'
AND cal.stamp <= '2012-02-13 01:02:21'
AND (
extract ('hour' from cal.stamp) >= extract ('hour' from '2011-02-13 22:00:00'::timestamp) or
extract ('hour' from cal.stamp) <= extract ('hour' from '2012-02-13 01:02:21'::timestamp)
)
ORDER BY stamp ASC;
我想我會去第二個,因爲我必須通過大約100萬個單獨的緯度/經度值,結果將在C++端處理,所以速度至關重要。非常感謝提示。 – sm90901
@ sm90901哎呀,你肯定不想要一個數組呢! refcursors或臨時表是這樣的數據量的方式。 –
將查看這些,再次感謝。 – sm90901