2012-04-27 27 views
3

僞鏈表我有以下幾列建立在SQL

table: route 
columns: id, location, order_id 

,它有值,如

id, location, order_id 
1, London, 12 
2, Amsterdam, 102 
3, Berlin, 90 
5, Paris, 19 

是否有可能做的Postgres SQL SELECT語句表那會返回每一行以及下一個最高order_id的id?所以,我想是這樣......

id, location, order_id, next_id 
1, London, 12, 5 
2, Amsterdam, 102, NULL 
3, Berlin, 90, 2 
5, Paris, 19, 3 

感謝

回答

6
select 
    id, 
    location, 
    order_id, 
    lag(id) over (order by order_id desc) as next_id 
from your_table 
+0

哇,太酷了,我從來沒有聽說過的滯後功能。功能如何強調?它對整個表格執行一次滯後()嗎?或者它會爲每一行做訂單嗎? – dan 2012-04-27 10:42:40

+0

這是一個**分析功能**。在這種情況下,引擎對行進行排序,然後對於每一行獲取先行行的值。所以,你有一個表的全面掃描和排序。 – 2012-04-27 11:00:13

+0

,並且如果您想要滯後多個列,即在next_location上添加滯後(位置)(order by order_id desc)。那會做第二種嗎?如果我也想要以前的ID和位置,那會做第三和第四種? – dan 2012-04-27 11:10:33

1

創建測試平臺第一:

CREATE TABLE route (id int4, location varchar(20), order_id int4); 
INSERT INTO route VALUES 
    (1,'London',12),(2,'Amsterdam',102), 
    (3,'Berlin',90),(5,'Paris',19); 

查詢:

WITH ranked AS (
    SELECT id,location,order_id,rank() OVER (ORDER BY order_id) 
     FROM route) 
SELECT b.id, b.location, b.order_id, n.id 
    FROM ranked b 
    LEFT JOIN ranked n ON b.rank+1=n.rank 
    ORDER BY b.id; 

你可以閱讀更多的窗口函數在documentation

0

是:

select * , 
(select top 1 id from routes_table where order_id > main.order_id order by 1 desc) 
from routes_table main 
+0

是的,我想出了一些類似的東西對此,但我認爲性能會很糟糕,因爲必須爲每行執行子查詢 – dan 2012-04-27 10:46:51

+0

這不是一個有效的PostgreSQL構造。 – vyegorov 2012-04-27 10:55:22

+0

這是我的查詢是有效的PostgreSQL: select * from mytable l left join mytable r on r.order_id =(select min(s.order_id)from mytable s where s.order_id> l.order_id) – dan 2012-04-27 11:13:23