2016-11-18 5 views
0

두 개의 열이있는 다음 표가 있습니다.PostgreSQL : 각 ID 열에 대해 첫 번째와 마지막으로 삽입 된 레코드를 가져옵니다.

:

create table tbl1 
(
    p_id int, 
    p_price int 
); 

삽입 :

INSERT INTO tbl1 values(1,100); 
INSERT INTO tbl1 values(1,50); 
INSERT INTO tbl1 values(1,20); 

INSERT INTO tbl1 values(2,10); 
INSERT INTO tbl1 values(2,20); 

INSERT INTO tbl1 values(3,22); 
INSERT INTO tbl1 values(3,89); 
INSERT INTO tbl1 values(3,500); 

쿼리 : 쿼리를 수행하면 나에게 각 행의 행 번호를 제공합니다.

SELECT p_id,p_price,row_number() over(partition by p_id order by p_id) rn 
from tbl1 

나는 단지 첫째 얻을 각 제품 ID (p_id)에 대한 삽입 기록을 지속하고자합니다.

예상 결과 :

p_id p_price  
----------------- 
1 100 
1 20 
2 10 
2 20 
3 22 
3 500 
+2

Postgres 또는 대부분의 SQL에 "처음"및 "마지막"삽입 된 레코드가 없습니다. 여기에 몇 가지 순서를 정의해야합니다. –

+2

"첫 번째"또는 "마지막"삽입 된 행 같은 것이 없습니다. 그리고 당신이 사용하는'order by '는 당신이 원하는 값을 가지지 않기 때문에 원하는 값을 얻을 수 없습니다 - 따라서 데이터베이스는 임의의 순서로 값을 반환 할 수 있습니다. –

+0

다른 컬럼을'createdDate'로 사용해보십시오. 레코드가 삽입 된 날짜를 기록합니다. – Viki888

답변

1

당신이 사용하는 서브 쿼리 수행 할 수

그래서 내부에서
SELECT p_id, p_price, rn from (
    SELECT *, last_value(rn) over(partition by p_id) as last from (
    SELECT p_id,p_price,row_number() over(partition by p_id order by p_id) rn 
    FROM tbl1 
) s1 
) s2 where rn=1 or rn=last; 

당신은 파티션으로 행 번호를 선택, 한 단계 위로 당신은 마지막 행을 얻을 숫자 (처음에는 항상 1). 그런 다음 최상위 레벨에서 필터를 수행 할 수 있습니다.

+0

이것은 처음 및 마지막으로 삽입되지 않습니다. 결과는 동일한'p_id'에 대해 시간이 지남에 따라 바뀔 것입니다. –

+0

@VaoTsun 네, 맞습니다. 삽입 순서 나 날짜를 저장하지 않으면 첫 번째와 마지막으로 삽입 된 행을 정확하게 전달할 수 없습니다. 필요하면 테이블을 확장하고 쿼리를 수정하여 테이블을 확장 할 수 있습니다. 결국 예제에서는 ID가 PK가 아닙니다. PK는 예를 들어, 삽입 시간. – quantummind