2011-11-11 3 views
1

죄송합니다.이 게시물이 중복되면.PostgreSQL : 날짜별로 그룹화하고 전날의 결과도 포함

저는 해당 펀드에서 발생한 거래마다 매일 특정 그룹의 주식을 보유한 고객의 수를 결정하는 쿼리를 작성하고 있습니다.

그래서 내 거래 테이블은 다음과 같습니다

CREATE TABLE trans(
transID SERIAL PRIMARY KEY, 
sin CHAR(9) REFERENCES customer(sin) ON UPDATE CASCADE ON DELETE CASCADE, 
fundID INT REFERENCES fund(fundID) NOT NULL, 
transDate DATE, 
shares INT, 
FOREIGN KEY (fundID) REFERENCES fund(fundID) ON UPDATE CASCADE ON DELETE CASCADE 
); 

여기 내 쿼리 :이 그 날에 주를 보유 총 고객을 반환

select f.transdate, count (f.sin) 
    from (select t1.transdate, t1.sin, sum(t2.shares) 
      from fund f natural join trans t1 natural join trans t2 
      where f.fundname='Energy' 
      and t1.sin = t2.sin 
      and t2.transdate <= t1.transdate 
      group by t1.transdate, t1.sin 
      having sum(t2.shares) > 0)as f group by f.transdate 
      order by f.transdate; 

. 그러나 전날 같은 펀드에 주식을 보유한 고객을 추가하고 싶습니다.

그래서 나는 다음 삽입을 추가하면, 말할 수

:이처럼되고 그것을 좋아하는 것, 그러나

transdate | count 
------------+------- 
2011-10-10 |  1 
2011-10-11 |  1 
2011-10-17 |  2 

:

INSERT INTO trans VALUES (DEFAULT, '1', '3', '2011-10-10', 400); 
INSERT INTO trans VALUES (DEFAULT, '3', '3', '2011-10-11', 324); 
INSERT INTO trans VALUES (DEFAULT, '5', '3', '2011-10-17', 201); 
INSERT INTO trans VALUES (DEFAULT, '8', '3', '2011-10-17', 472); 

그래서 내가 언급 쿼리가이 반환

transdate | count 
------------+------- 
2011-10-10 |  1 
2011-10-11 |  2 
2011-10-17 |  4 

자세히 알 수 있듯이 2011-10-11 말에 총 2 명의 사람들이 해당 기금 등을 보유하고있었습니다.

어떤 도움이 필요합니까?

답변

2

"지연"기능을 사용하는 윈도우 기능이 필요합니다. 나는 당신이 이러한 윈도우 기능을 처음 지원했을 때, 그러나 여기에서 현재의 9.x의 시리즈에 대한 설명서입니다 PostgreSQL의 어떤 버전의 확실하지 않다 :

창 작업 개요 : http://www.postgresql.org/docs/9.0/interactive/tutorial-window.html

과 :

창 기능 : http://www.postgresql.org/docs/9.0/interactive/functions-window.html

이 점을 염두에두고 쿼리를 다시 작성하는 다소 효율적인 방법이 있지만 작업 할 시간이 없습니다. 최선의 방법이 아니더라도 가장 쉬운 방법은 현재 쿼리를 가져 와서 CTE (http://www.postgresql.org/docs/9.0/interactive/queries-with.html)로 만들고 CTE를 사용하는 쿼리에서 창 함수를 사용하는 것입니다. 의미 :

WITH cte (transdate, peoplecount) AS (
your_current_query 
) 
SELECT transdate, lag() OVER (...) 
FROM cte; 

무언가. 희망이 도움이 :).

+0

감사합니다 ... 나는 지금 그것을보고 있습니다.이게 내가 필요로하는 것처럼 보입니다. –

+0

아무 문제 없어요 ... 그것이 효과가 있기를 바랍니다 !! –