2017-09-18 4 views
0

나는 아래 테이블을 가지고있다.PostgreSQL :이 시나리오에 대한 쿼리를 작성하는 방법

+_______+________+__________+________+ 
|Playid |billid| amount | Date | 
+_______+________+__________+________+ 
|123 | 345 | 144.9 | 2015-09| 
|123 | 456 | 200  | 2015-10| 
+_______+________+__________+________+ 

아래와 같이 가장 최근의 거래 날짜 (날짜)가있는 청구 금액 만 표시하도록 쿼리를 작성해야합니다.

+_______+________+__________+________+ 
|Playid |billid| amount | Date | 
+_______+________+__________+________+ 
|123 | 456 | 200  | 2015-10| 
+_______+________+__________+________+ 

어떻게 도와 주나요?

+1

지금까지 시도한 내용은 무엇입니까? –

+0

@ FerdinandGaspar 나는 select와 having 절에서 case 문과 함께 max (Date)를 사용했지만 예상대로 작동하지 않았다. –

+0

@KushalLNU 답변으로 "감사"를 게시하는 대신 작동중인 답변 중 하나를 수락해야합니다. 문제를 해결 한 답변의 투표 화살표 아래에있는 마크를 클릭하기 만하면됩니다. – Hadi

답변

1

MAX(Date)playid과 가장 최근 날짜 만 표시하려는 경우에 사용할 수 있습니다.

그러나 당신이하려는 일의 문제점은 모든 열을 표시하고자하는 것입니다. 순위 기능이 작동하는 곳입니다. 이 경우이 같은 row_number function를 사용할 수 있습니다

SELECT PlayId, billid, amount, date 
FROM 
(
    SELECT 
    PlayId, billid, amount, date, 
    row_number() over(partition by playid order by date dec) as rn 
    FROM tablename 
) t 
where rn = 1 

row_number() over(partition by playid order by date dec)playid의 각 그룹 순위 번호, 첫 번째 (가장 낮은) 가장 최근 날짜로 하나가 될 것입니다을 줄 것이다. 그런 다음 행 번호를 1로 필터링하면됩니다.

1

포스트 그램은 distinct on입니다. 글을 쓰는 것이 더 간단하며 종종 최상의 성능을 보입니다.

select distinct on (playid) t.* 
from t 
order by playid, order by date desc; 
관련 문제