2017-07-24 94 views
0

这是我的示例历史记录表。

id | time | price 
1 | 1-02-17 | 15.99 
1 | 1-03-17 | 15.99 
1 | 1-04-17 | 15.99 
1 | 1-05-17 | 20.99 
1 | 1-06-17 | 20.99 
1 | 1-07-17 | 15.99 
1 | 1-08-17 | 15.99 

我想类似这样的输出:以组

1-02-17 | 15.99 
1-05-17 | 20.99 
1-07-17 | 15.99 

基本上我想要的价格后按日期排序。Rails 5:按日期排序,然后按列分组

这可以通过导轨完成吗?

+0

ID是否总是1是正常的? Id应该是唯一的,所以这对我来说很奇怪。 如果我正确理解你想要做的是:为每个价格找到它的最低日期。正确? –

+0

@StephanePaquet这是产品ID,所以它在这里是非唯一的。我基本上每天检查产品ID 1的价格,然后我想绘制它。为了绘制它,我想要上面的输出。 –

+0

但是为什么'1-02-17'与'15.99'而不是'1-03-17'?你是否正在寻找@StephanePaquet认为的每个价格的最早日期?如果这就是你想要做的,你可能想看看窗口函数。 –

回答

0

如果价格点的数量不高,你可以获取从数据库中的记录,并做到这一点:

price_ranges, prev_price = {}, nil 
ProductHistory.where(product_id: 1).order(:date).find_each do |history| 
price_ranges[history.date] = history.price if history.price != prev_price 
prev_price = history.price 
end 

在这个循环结束时,你会得到:

{ "1-02-17": 15.99, "1-05-17": 20.99, "1-07-17": 15.99 } 

注意:关键将是Date对象而不是字符串,如果db列在datetime

如果记录的数量很高,我会建议在你的数据库中进行记录。这个问题看起来与你的用例非常相似,如果你有mysql,那么你可以在非自己的地方使用它 How to eliminate only continuous duplicates but not all duplicates in a select query (MySQL)?