【发布时间】:2021-04-30 09:56:07
【问题描述】:
我们有两张桌子:
- 一个由众多供应商投标(价格和数量),每小时 年。
- 第二张表格列出了每小时(数量)的消费者总需求
我们需要生成:
- 第三个表格列出了所有最便宜的供应商出价,但仅针对总消费者需求的数量。例如,虽然数量 (1) 可能有 10 个投标,但如果该小时的需求等于 (5),则只会选择最便宜的 5 个。
只有产品,它是同质的。因此,唯一相关的参数是价格和数量。价格是每单位数量的价格(即不是全部数量的总和)。
例子:
供应商出价(提供数量)
| Hour | Supplier | Price | Quantity |
|---|---|---|---|
| 1 | Siemens | 1 | 10 |
| 1 | Siemens | 4 | 20 |
| 1 | Fuji | 7 | 20 |
| 2 | ABB | 1 | 10 |
| 2 | Hitachi | 2 | 15 |
| 2 | Siemens | 4 | 10 |
总需求
| Hour | Quantity |
|---|---|
| 1 | 10 |
| 2 | 25 |
那么生成的表格应该是这样的:
中标(最便宜,总计需求)
| Hour | Supplier | Price | Quantity |
|---|---|---|---|
| 1 | Siemens | 1 | 10 |
| 2 | ABB | 1 | 10 |
| 2 | Hitachi | 2 | 15 |
如您所见,此表中所有出价的总和等于第二个表中的总需求。即使有额外的出价,这些也不会包含在此处,因为需求已得到满足。
通常,供应商投标的总和不会完全满足总需求,例如,如果需求为 100,但每个数量等于 30。在这种情况下,添加到表中的最后一个投标的数量是“截止”(即,仅从该出价中获取满足需求的数量)。
我们考虑通过 PLSQL 来处理这个问题,遵循以下步骤:
- 我们创建了一个 CURSOR,它选择特定小时内的所有出价,按价格排序
- 一个循环将出价插入新表,直到插入的出价(数量)总和达到该小时的总需求。
- 通过在每小时(10 年的时间,意味着大约 90k 次迭代)循环中重新声明 CURSOR 来重复该过程。
由于我们是简单的经济学家,在 SQL 方面的背景有限,这似乎是处理这个问题的最直接的方法。然而,这种方法似乎非常耗费资源。即有超过 1500 万行供应商投标,循环时间约为 90 000。
因此,我们想知道你们中比我们受过更多 SQL 教育的人是否会对我们的方法提出任何建议。例如。 - 这是处理这个问题的唯一方法吗?有没有更好、更有效的方法?
【问题讨论】:
-
价格是每件商品的价格,还是总价?换句话说,
price=10, quantity=20是否优于price=5, quantity=5?如果价格是“总”价格,你会在“切断”时修改价格吗?换句话说,如果你有price=9, quantity=30而你只需要10个,那会变成price=9, quantity=10还是price=3, quantity=10?如果需求下降未填满,是否会“延续”到下一小时? -
(i) 价格为单位数量,(ii) 切断时价格未修改,(iii) 未满足的需求确实不会结转