2012-09-20 2 views
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; 

답변

2
  • 에 배열을 전달 배열의 요소 위에 함수 및 FOR r IN SELECT * FROM unnest(the_array) LOOP이 있습니다. 여기서 r은 함수의 DECLARE 절에있는 record 변수입니다. 또는

  • 함수에 전달 된 refcursor에 대한 루프. PL/PgSQL cursors을 참조하십시오.

는 더 나은의 LOOP를 방지하고 CTE에 SELECT unnest(thearray)를 통합 할 수 있습니다. PL/PgSQL의 루프는 SQL CTE의 해당 루프보다 훨씬 느립니다.

unnest, LOOP을 참조하십시오.

+0

약 1 백만개의 위도/경도 값을 전달해야하므로 두 번째 테스트를 진행할 것입니다. 결과는 C++에서 처리되므로 속도가 중요합니다. 팁을 가져 주셔서 감사합니다. – sm90901

+1

@ sm90901 Yikes, 그럼 배열을 원하지 않을거야! 참조 자나 임시 테이블은 이와 같은 양의 데이터를 처리하는 방법입니다. –

+0

다시 살펴 보겠습니다. – sm90901