0

我已经编写了一个要部署到 heroku 的 Web 应用程序。我使用 PostgreSQL 9.1.2 编写它。但是似乎heroku上的免费共享数据库只有postgres 8.3。他们正在升级到 9。很快就会有一些东西,但在那之前,我的一个 SQL 查询不起作用。这是:

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 上工作?

4

1 回答 1

2

请注意,在 8.4 之前的 PostgreSQL中不存在 Window 函数


编辑2:

你让我非常好奇,我玩弄了这些查询。

首先需要注意的一些事项:

  1. 为了达到预期的结果,您必须多次加入表。鉴于 PostgreSQL 8.3 不支持 CTE,我创建了一个视图。幸运的是,您的情况只需要一个视图,因为您OVER ()对所有窗口函数使用相同的条件;

  2. row_number应该用于对数据子集进行操作,所以我在视图中添加了这个字段;

  3. 要形成PARTITION,您应该在子句=中的所有字段的连接表上使用运算符;PARTITION

  4. row_number是使用子查询(无连接)形成的,并计算与分区匹配且ORDER BY字段小于或等于当前行的所有行。请注意,如果ORDER BY字段不是唯一的,则此方法将不起作用! 如果不是这种情况,则创建这样的字段。

  5. 要模拟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 上完成的,我会在走这条路之前三思而后行。

于 2012-05-16T18:18:04.710 回答