2012-04-27 46 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