我对 SQL 相当精通,但是这个问题让我自己困惑了很长一段时间。在最基本的意义上,只有两个表:
Items
+----+--------+
| id | title |
+----+--------+
| 1 | socks |
| 2 | banana |
| 3 | watch |
| 4 | box |
| 5 | shoe |
+----+--------+
...和价格表:
Prices
+---------+-----------+-------+------------+
| item_id | vendor_id | price | created_at |
+---------+-----------+-------+------------+
| 1 | 1 | 5.99 | Today |
| 1 | 2 | 4.99 | Today |
| 2 | 1 | 6.99 | Today |
| 2 | 2 | 6.99 | Today |
| 1 | 1 | 3.99 | Yesterday |
| 1 | 1 | 4.99 | Yesterday |
| 2 | 1 | 6.99 | Yesterday |
| 2 | 2 | 6.99 | Yesterday |
+---------+-----------+-------+------------+
(请注意:created_at 实际上是一个时间戳,提供“今天”和“昨天”这两个词只是为了快速传达这个概念)。
我的目标是返回一个简单的结果,其中包含与最新、最低价格相关的库存项目,包括对提供所述价格的 vendor_id 的引用。
但是,我发现绊脚石似乎是要处理的语句(或语句)要求的绝对数量:
- 每个项目有多个供应商,因此我们需要确定每个项目的所有供应商之间哪个价格最低
- 物品的新价格会定期附加,因此我们只想考虑每个供应商的每件物品的最新价格
- 我们希望将所有这些汇总到一个结果中,每行一个项目,其中包括项目、价格和供应商
看起来很简单,但我发现这个问题非常困难。
请注意,我使用的是 Postgres,因此它提供的所有功能都可以使用(即:窗口函数)。