PostgreSQL:获取每个ID列的第一个和最后一个插入记录

时间:2016-11-18 08:48:42

标签: sql postgresql greatest-n-per-group

我的下表有两列。

表格

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 

1 个答案:

答案 0 :(得分: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)。 然后顶级可以进行过滤。