2014-01-28 2 views
2

으로 주문하지 ROW_NUMBER 나는이 테이블이 있습니다PostgreSQL은 내가 포스트 그레스 9.3.2 일하고 날짜

id startdate enddate no_of_days_between 

1 2010-12-22 2010-12-23 1 
1 2010-12-23 2010-12-24 1 
1 2010-12-24 2010-12-25 1 
1 2010-12-25 2010-12-26 1 
1 2010-12-26 2010-12-27 1 
1 2010-12-27 2010-12-28 1 
1 2010-12-28 2010-12-29 1 
1 2010-12-29 2011-03-06 67 
1 2011-03-06 2011-03-07 1 
1 2011-03-07 2011-03-08 1 
1 2011-03-08 2011-03-09 1 

무엇을 내가하고 싶은 일 연속의 행진을 찾을입니다. 이를 위해,이 쿼리에서 ROW_NUMBER 창 기능을 사용하고 있습니다 :

select t.*, row_number() over (partition by no_of_days_between order by enddate) as no_of_consecutive_days from t 

내가 다시 원하는 것은이 같은 것입니다 :

id startdate enddate no_of_days no_of_consecutive_days 
          _between 
1 2010-12-22 2010-12-23 1   1 
1 2010-12-23 2010-12-24 1   2 
1 2010-12-24 2010-12-25 1   3 
1 2010-12-25 2010-12-26 1   4 
1 2010-12-26 2010-12-27 1   5 
1 2010-12-27 2010-12-28 1   6 
1 2010-12-28 2010-12-29 1   7 
1 2010-12-29 2011-03-06 67   1 
1 2011-03-06 2011-03-07 1   1 
1 2011-03-07 2011-03-08 1   2 
1 2011-03-08 2011-03-09 1   3 

그러나 쿼리 반환보다가 처음으로 주문했다 어떤지 no_of_days_between 다음 ENDDATE에 의해 그래서 나는 다시 얻을 :

id startdate enddate no_of_days no_of_consecutive_days 
          _between 
1 2010-12-22 2010-12-23 1   1 
1 2010-12-23 2010-12-24 1   2 
1 2010-12-24 2010-12-25 1   3 
1 2010-12-25 2010-12-26 1   4 
1 2010-12-26 2010-12-27 1   5 
1 2010-12-27 2010-12-28 1   6 
1 2010-12-28 2010-12-29 1   7 
1 2011-03-06 2011-03-07 1   8 
1 2011-03-07 2011-03-08 1   9 
1 2011-03-08 2011-03-09 1   10 
1 2010-12-29 2011-03-06 67   1 

사람이 전에이 문제로 실행 했습니까? 먼저 명령을 내리고 파티션을 나누려면 어떻게해야합니까? 행의 다른 순서

감사

답변

0

SQL 표준에 따라 예상되는 동작으로 보입니다. 필자는 원하는 작업을 수행하기 위해 함수를 작성해야했습니다.이 함수는 날짜순으로 정렬 된 다음에 파티션입니다. 즉, 카운터 이외의 다른 숫자가 나타날 때마다 카운터가 재설정됩니다.

연속적인 연속으로 매우 유용했습니다. 내 기능

코드 :

CREATE TYPE consecutive_length_type AS 
    (daystreak integer, 
    streakstart date, 
    streakend date; 

CREATE OR REPLACE FUNCTION get_maxconsecutive_day_streak() RETURNS consecutive_length_type AS 
$BODY$ 
declare 
    max_length integer := 0; 
    end_date date; 
    cons_days integer :=0; 
    return_rec consecutive_length_type; 
    rec record; 
begin 

for rec in 
    select * from table t --table as above 
loop 
    if rec.no_of_days_between = 1 then 
     cons_days := cons_days + 1 ; 
     if cons_days > max_length then 
      max_length := cons_days; 
      end_date := rec.enddate ; 
          --this way I can see when the streak ended 
     end if; 
    else 
     cons_days := 0; 
    end if; 
end loop; 


return_rec.daystreak := max_length; 
return_rec.streakend := end_date; 
return_rec.streakstart := end_date - max_length; 
         --I am calculating the day start so I can use it further on 

return return_rec; 
end; 
$BODY$ 
    LANGUAGE plpgsql ; 

내가 원래 가지고하는 일에 매핑 된 ID의 테이블입니다. 연속 된 두 일 간의 일수를 계산하기 위해 다음 쿼리를 실행합니다.

select id , 
lag(date_logged,1,date_logged) over 
     (partition by id order by id, date_logged ) as startdate 
date_logged as enddate , 
date_logged- lag(date_logged,1,date_logged) over 
     (partition by id order by id, date_logged ) as no_of_days_between 
from table_name; 
2
당신은 아직도 당신의 쿼리의 끝에 "ENDDATE BY ORDER"가 필요

, 당신을주는 것 같은 느낌이 든다 어떤 포스트 그레스입니다.

OVER 절의 ORDER BY는 row_number()가 데이터를 보는 방법 만 제어하며 데이터가 최종적으로 반환되는 방식은 제어하지 않습니다.

+0

그래도 순서는 여전히 올바른 방법으로 데이터를 보지 못합니다. 그것은 내가 그것을 분할하도록 요청한 칼럼으로 그것을 주문했습니다. – mskem