我在表格中有两列:
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)
答案 0 :(得分:2)
你的问题造成了一些混乱,因为平均评分为"通常是在多行之间计算的值,无法对其进行索引。
在您的情况下,您显然希望按相同行中的两列商来订购,这恰好是"总计"和"计数"。在这种情况下,您可以拥有expression index,当然 - 您已经找到了一个。
您可以使用NULLIF
进行简化:
CREATE INDEX posts_avg_rating_index
ON "Posts" (cast(rating_total AS float)/NULLIF(rating_count, 0) DESC NULLS LAST, id DESC);
在查询中使用相同的表达式。
关于cast()
简写语法name::type
和表达式索引:
而是使用合法的名称。标识符中的破折号(-
)在双引号时是合法的,但只是要求麻烦。