mysql - 从多个供应商处为库存项目选择最新、最低的价格

标签 mysql sql postgresql greatest-n-per-group distinct-on

我对 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实际上是一个时间戳,提供“今天”和“昨天”这两个词只是为了快速传达这个概念)。

我的目标是获取一个简单的结果,其中包含与最新最低价格相关的库存商品,包括对提供所述价格的供应商 ID 的引用。

但是,我发现绊脚石似乎是要处理的语句(或多个语句)的需求数量:

  • 每个商品都有多个供应商,因此我们需要确定每个商品的所有供应商中哪个价格最低
  • 定期附加商品的新价格,因此我们只想考虑每个供应商的每件商品的最新价格
  • 我们希望将所有内容汇总为一个结果,每行一个项目,其中包括商品、价格和供应商

看似简单,但我发现这个问题异常困难。

请注意,我使用的是 Postgres,因此它提供的所有功能都可以使用(即:窗口函数)。

最佳答案

在 Postgres 中使用 DISTINCT ON 更简单:

每个供应商每件商品的当前价格

SELECT DISTINCT ON (p.item_id, p.vendor_id)
       i.title, p.price, p.vendor_id
FROM   prices p
JOIN   items  i ON i.id = p.item_id
ORDER  BY p.item_id, p.vendor_id, p.created_at DESC;

每个项目的最佳供应商

SELECT DISTINCT ON (item_id) 
       i.title, p.price, p.vendor_id -- add more columns as you need
FROM (
   SELECT DISTINCT ON (item_id, vendor_id)
          item_id, price, vendor_id -- add more columns as you need
   FROM   prices p
   ORDER  BY item_id, vendor_id, created_at DESC
   ) p
JOIN   items i ON i.id = p.item_id
ORDER  BY item_id, price;

->SQLfiddle demo

详细说明:
Select first row in each GROUP BY group?

关于mysql - 从多个供应商处为库存项目选择最新、最低的价格,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18410600/

相关文章:

python - Django:分页器 + 原始 SQL 查询

sql - 我可以使用 tsvectors 指定只匹配包含一个词的向量吗?

返回多个结果集的 PostgreSQL 函数

php - 有没有什么方法可以在没有复制和第三方软件的情况下在 PHP 中同步远程和本地数据库

php - 显示可能通过 HTTP POST (PHP + MySQL) 更改的项目列表的最佳做法是什么

sql - Oracle:如何获取刚刚插入的行的序列号?

mysql - 我的 Mysql 查询没有获得正确的预期输出?

sql - 将多个 "group by"组合成单个查询?

php - 这是什么类型的字符编码?在 MySql 中存储它的最佳数据类型是什么?

字段、EAV 等中的 MySQL 多个值