我希望建立一个应用程序,跟踪随着时间的推移某些亚马逊产品的价格变化。我想出了以下表格:
product
| ID | Name |
| 1 | iPhone case |
| 2 | Wallet |
product_price
| ID | product | price | date |
| 1 | 1 | 12.99 | 2023-03-04 |
| 1 | 2 | 10.99 | 2023-03-02 |
| 1 | 1 | 9.99 | 2023-03-01 |
但是,我现在如何编写一个SQL查询来检索我所有的产品及其最新价格呢?
另一个我可以想到的解决方案是在product
表中添加另一列:
| ID | name | latest_price |
| 1 | iPhone case | 1 ]
| 2 | Wallet | NULL |
这样我就可以很容易地编写一个查询来获取产品及其最新价格。缺点是每当价格发生变化时,我也需要更新这个列。
有什么最佳实践吗?假设这看起来不像是一个新问题。
2条答案
按热度按时间sr4lhrrt1#
在Postgres中使用
distinct on ()
非常有效:这可以在连接中使用:
另一种选择是使用横向连接,有时更快:
在任何情况下,
product_price (product, date desc)
上的索引都会加快这些查询的速度。一种不同的建模方法是使用daterange来定义价格有效的时间。这在更新时有点复杂,因为在添加新价格之前必须关闭“最后一个”范围。但查询起来更灵活(甚至可能更快):
排除约束将防止单个产品的范围重叠。
然后,您可以使用以下命令查询“最新价格”(=“今天”的价格):
但这也使得查找任何日期的价格变得非常容易(例如,订购产品的日期):
如果只存储开始日期,则运行该查询的开销要大得多。
qnzebej02#
要获得最新的价格,您可以使用查询像上面