2016-11-18 41 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

相关问题