ruby-on-rails-3 - 计算多个属性的排名

标签 ruby-on-rails-3 postgresql

我正在开发一款赛车计时应用。当汽车在赛道上比赛时,用户将每辆 Car 的分段时间输入到应用程序中。然后,该应用程序会在每次拆分时对每辆车进行排名,并将其显示在我的 View 中。

例如,汽车 A 的 split_1 为 5.00 秒,split_2 为 15.00 秒,split_3 为 25.00 秒。 B 车的 split_1 为 5.50 秒,split_2 为 14.00 秒,split_3 为 23.00 秒。在我看来,汽车 A 的排名将是 1、2、2。汽车 B 将是 2、1、1。

我编写了一个低效的数据库密集型方法来计算每个拆分的排名。基本上,该方法获取 Timesheet 上每辆车的所有 split_1 时间并将它们放入排序数组中,然后比较当前 Car 的 split_1 以找到其位置。它对每辆车和每一圈都这样做。这是一场噩梦。

class Car < ActiveRecord::Base
     has_many :laps
end

class Lap < ActiveRecord::Base
     belongs_to :car
     belongs_to :timesheet
end

class Timesheet < ActiveRecord::Base
     has_many :laps
end

我知道我缺少一种更简单、更有效的方法来计算每个排名。我正在使用 Postgres 9.2,以我有限的理解和经验,我认为窗口函数可能会提供一个解决方案。还有别的办法吗?

最佳答案

像这样的表格:

CREATE TABLE split_times (car TEXT, split INT, "time" INTERVAL);
INSERT INTO split_times VALUES ('A', 1, '00:00:05');
INSERT INTO split_times VALUES ('A', 2, '00:00:15');
INSERT INTO split_times VALUES ('A', 3, '00:00:25');
INSERT INTO split_times VALUES ('B', 1, '00:00:05.5');
INSERT INTO split_times VALUES ('B', 2, '00:00:14');
INSERT INTO split_times VALUES ('B', 3, '00:00:23');
CREATE INDEX split_times_split_and_time ON split_times (split, "time");

这会让你 split 等级:

SELECT 
   car, split,
   RANK() OVER (PARTITION BY split ORDER BY time) AS rank 
FROM 
   split_times;

您可以使用它来获取每辆车的结果:

WITH x AS (
 SELECT 
    car, split, 
    RANK() OVER (PARTITION BY split ORDER BY time) AS rank 
 FROM
    split_times ORDER BY split
 )

SELECT 
   car, ARRAY_AGG(rank) AS ranks 
FROM
   x
GROUP BY car;

SQL Fiddle demo

窗口函数 documentation

关于ruby-on-rails-3 - 计算多个属性的排名,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16845951/

相关文章:

SQL 窗口函数 - SELECT DISTINCT ORDER BY LIMIT

Python re.findall 正则表达式和文本处理

ruby-on-rails - 为什么 ActiveResource 返回的是哈希数组而不是对象?

c# - 在数据库中存储 RsaSecurityKey

Laravel Restful API

ruby-on-rails - 为 OAuth (Ruby) 创建签名和 Nonce

sql - 搜索具体化路径树的最右侧节点

ruby - 具有 respond_with destroy 操作的 Rails 嵌套资源

ruby-on-rails-3 - Rails 3 基于上下文的路由

ruby-on-rails-3 - Rails 4.0.0.0 俄罗斯娃娃缓存与belongs_to 模型