请注意,在 8.4 之前的 PostgreSQL中不存在 Window 函数。
编辑2:
你让我非常好奇,我玩弄了这些查询。
首先需要注意的一些事项:
为了达到预期的结果,您必须多次加入表。鉴于 PostgreSQL 8.3 不支持 CTE,我创建了一个视图。幸运的是,您的情况只需要一个视图,因为您OVER ()
对所有窗口函数使用相同的条件;
row_number
应该用于对数据子集进行操作,所以我在视图中添加了这个字段;
要形成PARTITION
,您应该在子句=
中的所有字段的连接表上使用运算符;PARTITION
row_number
是使用子查询(无连接)形成的,并计算与分区匹配且ORDER BY
字段小于或等于当前行的所有行。请注意,如果ORDER BY
字段不是唯一的,则此方法将不起作用!
如果不是这种情况,则创建这样的字段。
要模拟ORDER BY
非函数的子句row_number
,您可以加入row_number
字段,使其成为+1
, -1
,min()
或max()
在加入的一侧,分别匹配,lead()
和函数。lag()
first_value()
last_value()
请考虑以上第4点!
您的查询可以通过以下方式更改(使用前比较输出):
-- 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
-- ...
我使用了来自Window 函数和更多“本地”聚合的修改后的示例数据,并创建了一个沙箱来展示它在SQL Fiddle上的工作方式。
尽管如此,鉴于所有开发都是在 9.1.2 上完成的,我会在走这条路之前三思而后行。