为 Heroku 重写 PostgreSQL 查询

Posted

技术标签:

【中文标题】为 Heroku 重写 PostgreSQL 查询【英文标题】:Rewrite PostgreSQL query for Heroku 【发布时间】:2012-07-03 19:18:28 【问题描述】:

请帮我重写它,以便它可以在 Heroku 上运行,其中 PostgreSQL (8.3.11) 不理解 over 关键字。

SELECT
    user_id,
    round(max(hspeed) * 2.238) as chs,
    percent_rank() over (partition by con_size_id ORDER BY MAX(hspeed))
FROM
    summaries ss
    INNER JOIN spaths s ON ss.spath_id = s.id
    INNER JOIN cons c ON c.id = s.con_id
    INNER JOIN users u ON c.user_id = u.id
WHERE
    con_size_id = 1
GROUP BY
    user_id,
    con_size_id;

“user_id”和“con_size_id”来自“cons”表,“hspeed”来自“summaries”。

【问题讨论】:

Heroku 是否支持完整的 ANSI SQL 92 语法? 我怀疑“over”是否来自 ANSI SQL 92。他们说这种语法在 PG 9.1 中可用,只能用于生产数据库。他们说:几乎完全符合 ANSI-SQL 92 和大量符合 ANSI 99 (paragoncorporation.com/ArticleDetail.aspx?ArticleID=11) PostGres 支持Percent_Rank()。 postgresql.org/docs/8.4/static/functions-window.html PGError: ERROR: 在“over”处或附近出现语法错误 PostgreSQL 在 8.4 中获得了窗口函数,您的 Heroku 数据库仍在使用 8.3。可以升级到专用数据库或 9.1 吗?见blog.heroku.com/archives/2012/5/1/… 【参考方案1】:

答案是升级到 8.4 或更高版本。如果没有大量复杂的用户定义函数来包装您的查询,8.3 及更低版本无法合理地支持所需的功能。

【讨论】:

以上是关于为 Heroku 重写 PostgreSQL 查询的主要内容,如果未能解决你的问题,请参考以下文章

Heroku postgresql 查询在 Heroku 上不起作用,但在本地工作

PostgreSQL——查询重写——定义规则

PostgreSQL——查询重写——定义规则

PostgreSQL——查询重写——删除重写规则以及对查询树进行重写

PostgreSQL——查询重写——删除重写规则以及对查询树进行重写

PostgreSQL 源码解读(24)- 查询语句#9(查询重写)