2012-05-16 29 views
0

我寫了一個web應用程序來部署到heroku。我使用PostgreSQL 9.1.2編寫它。但似乎在heroku上的免費共享數據庫只是postgres 8.3。他們正在升級到9.不久之前的某些事情,但在此之前,我的一個SQL查詢不起作用。它是:如何在PostgreSQL中做窗口函數8.3

SELECT id, route_id, location_id, order_id, blogtext, 
    lead(id) over (PARTITION BY route_id ORDER BY order_id ASC) AS next_id, 
    lead(location_id) over (PARTITION BY route_id ORDER BY order_id ASC) AS next_location_id, 
    lag(id) over (PARTITION BY route_id ORDER BY order_id ASC) as previous_id, 
    lag(location_id) over (PARTITION BY route_id ORDER BY order_id ASC) AS previous_location_id, 
    row_number() over (PARTITION BY route_id ORDER BY order_id ASC) AS indx 

是否有可能重新編寫這個工作在PostgreSQL 8.3上?

+0

您將需要等待9.x升級 –

回答

2

請注意,在PostgreSQL before 8.4


EDIT2:

你讓我真的古董,我已經與查詢各地播放。

有些事情首先要注意:

  1. 爲了達到預期的效果,你必須加入表本身的許多倍。鑑於PostgreSQL 8.3不支持CTE,我創建了一個視圖。幸運的是,在您的情況下只需要一個視圖,因爲您對所有窗口函數使用相同的條件;

  2. row_number應該用於操作數據子集,所以我已經將這個字段添加到視圖中;

  3. 要形成PARTITION,你應該爲PARTITION子句中的所有字段連接的表使用=操作;

  4. row_number使用子查詢(無連接)並計算與分區匹配的所有行並使ORDER BY字段小於或等於當前字段。 請注意,如果ORDER BY字段不是唯一的,這種方法將無法正常工作! 如果不是這樣,那麼創建這樣的字段。

  5. 爲了模擬在非row_number功能ORDER BY條款,你加入的row_number領域,使其正對接合的邊+1-1min()max(),分別匹配lead()lag()first_value()last_value()功能。

請考慮點以上!

你的查詢可以通過改變以下方式(使用前比較輸出):我用從Window functions and more "local" aggregation修改樣本數據

-- First, create a support view 
CREATE VIEW table_v AS 
SELECT id, route_id, location_id, order_id, blogtext, 
     (SELECT count(*) FROM table 
     WHERE route_id = t.route_id AND order_id <= t.order_id) AS row_number 
    FROM table t; 

-- Now, the query 
SELECT t.id, t.route_id, t.location_id, t.order_id, t.blogtext, 
     tlead.id AS next_id, tlead.location_id AS next_location_id, 
     tlag.id AS previous_id, tlag.location_id AS previous_location_id, 
     t.row_number AS indx 
    FROM table_v t 
    LEFT JOIN table_v tlead 
    ON tlead.route_id = t.route_id AND tlead.row_number = t.row_number + 1 
    LEFT JOIN table_v tlag 
    ON tlag.route_id = t.route_id AND tlag.row_number = t.row_number - 1 
    -- 
    -- proceed with the query here 
    -- ... 

並創建了一個沙盒,以顯示它是如何工作的SQL Fiddle

不過,考慮到所有的開發都是在9.1.2上完成的,在這樣做之前我會考慮三次。

+0

是否可以使用連接來完成? – dan

+0

@dan,我提供了一個基於聯接的解決方案,希望它能夠適應您。 – vyegorov

+0

哇感謝 – dan