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

相關問題