【发布时间】:2015-04-24 13:45:42
【问题描述】:
我在一个表中有两列:
rating_total integer
rating_count integer
rating_total 是总评分的总和,评分计数是总评分的数量。我想按平均价格订购:
ORDER BY (rating_total/rating_count) DESC, id ASC
我应该为average_rate 创建单独的列吗?或者可以创建一些索引来加快速度?
我已经设法创建这样的索引:
CREATE INDEX "posts-avg-rating-index"
ON "Posts" (("rating_total"::float/(CASE "rating_count" WHEN 0 THEN NULL ELSE "rating_count" END)) DESC NULLS LAST, id DESC);'
这适用于这样的订购:
ORDER BY (("rating_total"::float/(CASE "rating_count" WHEN 0 THEN NULL ELSE "rating_count" END)) DESC NULLS LAST, id DESC)
【问题讨论】:
-
您应该使用单独的
column或在此答案上使用look -
您是否尝试在
( (rating_total/rating_count), id )上创建索引?您还应该阅读以下内容:stackoverflow.com/tags/postgresql-performance/info 并添加缺失的信息。 -
很可能不,您可能应该在索引定义中使用与 order by 子句中相同的表达式,然后它肯定会起作用。
-
你真的应该避免引用标识符。从长远来看,它们带来的麻烦远多于它们的价值。
-
PostgreSQL 中的列名应始终小写,下划线用作单词/标记分隔符。其他任何事情都只是要求痛苦。仅仅因为您的数据源是来自 REST API 的 JSON,这并不意味着数据库中的列名必须遵循与 JSON 响应中的键相同的命名约定。
标签: sql postgresql indexing sql-order-by postgresql-9.3