0

내 질문에 계속 How can I take two rows for one Distinct value in postgresql?postgresql에서 하나의 Distinct 값에 대해 두 행을 취하는 방법은 무엇입니까?

위의 질문에 나는 별개의 열에서 2 개의 값을 취하는 기본적인 문제에 대한 해결책을 얻었다.

하지만 내 테이블

demo_table 
id | column1 | column2 |  timestamp 
1 | 1 | 3 | 2016-09-23 00:20:20 
2 | 2 | 3 | 2016-09-24 00:20:20 
3 | 3 | 4 | 2016-09-24 00:20:20 
4 | 4 | 3 | 2016-09-25 00:20:20 
5 | 5 | 4 | 2016-09-25 00:20:20 
6 | 6 | 3 | 2016-09-27 00:20:20 
7 | 7 | 5 | 2016-09-28 00:20:20 
8 | 8 | 5 | 2016-09-28 00:20:20 
9 | 9 | 3 | 2016-09-30 00:20:20 

쿼리에 타임 스탬프를 도입 때 작업을, 나는 새로운 질문

을 발견하면서

select id, column1, column2 
from (
    select id, column1, column2, 
     row_number() over (partition by column2 order by id) as rn 
    from demo_table 
) t 
where rn <= 2; 

내가 무엇을 기대 반환하지 않았습니다 :

id | column1 | column2 |  timestamp 
3 | 3 | 4 | 2016-09-24 00:20:20 
5 | 5 | 4 | 2016-09-25 00:20:20 
6 | 6 | 3 | 2016-09-27 00:20:20 
7 | 7 | 5 | 2016-09-28 00:20:20 
8 | 8 | 5 | 2016-09-28 00:20:20 
9 | 9 | 3 | 2016-09-30 00:20:20 
id | column1 | column2 |  timestamp 
6 | 6 | 3 | 2016-09-27 00:20:20 
9 | 9 | 3 | 2016-09-30 00:20:20 
5 | 5 | 4 | 2016-09-25 00:20:20 
3 | 3 | 4 | 2016-09-24 00:20:20 
7 | 7 | 5 | 2016-09-28 00:20:20 
8 | 8 | 5 | 2016-09-28 00:24:20 

표는 2 열에서 구별해야하고 또한

이 가능 함께 열에서 같은 값의 매핑이 행을 유지해야한다 :이 결과를 줄 것이다 질의를 필요로?

+0

예상 출력은 행의 순서에 따라 실제 출력과 같습니다. – redneb

+0

@redneb 아니, 실제로 u가 타임 스탬프를 보게되면 그 순서가 바뀌어야하는 행의 순서가 바뀐다. –

+2

그래서 'ORDER BY'를 추가하면된다. – redneb

답변

0

열 2의 각 값에 대해 "2 개의 가장 최근"행을 표시하려는 것입니다.이를 수행하려면 over clauseorder by 요소를 조정하십시오.

여기에서 "가장 최근"행을 가져 오려면; 의 시간 소인을 내림차순으로으로 지정하십시오. 드물지만 주문시 타이 브레이커가 필요하면 id 열이 유지됩니다. 이 (새로운 "파티션"발견 될 때) 다시 시작을 주문할 때 제어하는 ​​partition by 인수 인 over clause에서와 :

select id, column1, column2, timestamp 
from (
    select id, column1, column2, timestamp, 
     row_number() over (partition by column2 order by timestamp DESC, id) as rn 
    from demo_table 
) t 
where rn <= 2 
order by column2, timestamp 
; 

주 (타임 스탬프의 마지막 순서는 오름차순으로 변경) order by 그러면 "파티션"의 어느 행이 1이되는지 제어합니다.

+0

질문이 지금 해결 되었습니까? 이 답변에 대해 질문이 있습니까? [help/accepting] (https://stackoverflow.com/help/someone-answers)에 대한 자세한 내용은 "[** 클릭 **] (https://ibb.co/ikqyO6)"대답을 수락하려면 –