2013-07-17 1 views
3

특정 날짜에 해당하는 레코드의 수를 추출하려고하고 있으며, 데이터베이스의 다음 날짜에 해당 user_ids가없는 user_ids를 추출하려고합니다. 이것은 내가 plpgsql를 사용하여 (달성하기 위해 노력하지만, 함수를 정의하고 있지 않다 방법입니다 :plpgsql 오류 : RETURN에 반환 할 함수에 매개 변수를 사용할 수 없습니다.

DO 
    $BODY$ 
    DECLARE 
     a date[]:= array(select distinct start_of_period from monthly_rankings where balance_type=2); 
     res int[] = '{}'; 
    BEGIN 
     FOR i IN array_lower(a,1) .. array_upper(a,1)-1 
     LOOP 
      res:=array_append(res,'SELECT COUNT(user_id) from (select user_id from monthly_rankings where start_of_period=a[i] except select user_id from monthly_rankings where start_of_period=a[i+1]) as b'); 
        i:=i+1; 
      END LOOP; 
      RETURN res; 
     $BODY$ language plpgsql 

오류가 발생합니다 : 결과를 검색 할 수 없습니다 : ERROR : RETURN 무효 LINE을 반환하는 함수에서 매개 변수를 가질 수 없습니다 11 : RETURN res; 이 절차 언어에 익숙하지 않아 함수가 void를 반환하는 이유를 알 수 없습니다. 변수에 값을 할당하고 NULL이 아닌 빈을 선언했습니다. 구문이나 더 중요한 추론이 있습니까? 실수는 무엇입니까?

답변

2

1) DO에서 RETURN을 전혀 쓸 수 없습니다.. 대신 CREATE FUNCTION이 필요합니다.

2.) 아무 것도 필요하지 않습니다. 크기 순서가 빠를 것이다,이 쿼리를 사용

WITH x AS (
    SELECT DISTINCT start_of_period 
     ,rank() OVER (ORDER BY start_of_period) AS rn 
    FROM monthly_rankings 
    WHERE balance_type = 2 
    ) 
SELECT x.start_of_period, count(*) AS user_ct 
FROM x 
JOIN monthly_rankings m USING (start_of_period) 
WHERE NOT EXISTS (
    SELECT 1 
    FROM x x1 
    JOIN monthly_rankings m1 USING (start_of_period) 
    WHERE x1.rn = x.rn + 1 
    -- AND m1.balance_type = 2 -- only with matching criteria? 
    AND m1.user_id = m.user_id 
    ) 
-- AND balance_type = 2 -- all user_id from these dates? 
GROUP BY x.start_of_period 
ORDER BY x.start_of_period 

이 마지막 예선 start_of_period를 포함, 당신은 당신의 plpgsql 코드에서처럼 그것을 제외 할 수 있습니다.