最低价格选择

时间:2009-12-17 08:17:21

标签: sql algorithm

情况如下:

我们有产品'A123',我们必须记住它的最低价格。 一个产品的价格来自随机数量的商店,并且无法判断商店x何时会向我们发送'A123'的价格。

所以我有一个带有列的SQL表:

product_number
price
shop (from which shop this price comes)

用于更新产品价格的SQL函数如下所示(这是SQL伪代码,语法无关紧要):

function update_product(in_shop, in_product_number, in_price)
    select price, shop into productRow from products where product_number = in_product_number;
    if found then
        if (productRow.price > in_price) or (productRow.price < in_price and productRow.shop = in_shop) then
            update row with new price and new shop
        end if;
    else
       insert new product that we didn't have before
    end if;

(productRow.price&lt; in_price和productRow.shop = in_shop)条件是为了防止这样的情况:

在产品表中我们有

A123 22.5 amazon

然后再来自亚马逊的信息:

A123 25 amazon

由于上述条件,我们将价格更新为更高,这是正确的行为。

但算法在这种情况下失败:我们再次在products表中有一行:

A123 22.5 amazon
然后来自梅林的信息

A123 23 merlin (we don't update because price is higher)

然后来自亚马逊的信息

A123 35 amazon

我们更新表格,现在我们有:

A123 35 amazon

但这是错误的,因为此前Merlin的产品价格较低。

知道如何避免这种情况吗?

3 个答案:

答案 0 :(得分:3)

您要解决问题的唯一方法是跟踪每个商店的价格,然后只返回当前最低价格。因此,例如,您需要一个类似于您已有的表格,但当您从表格中选择以下内容时:

select min(price)
  from products
  where product_number = :my_product

就个人而言,如果是我,我会在收到产品价格更新时保留时间戳,以便您能够确定何时获得更新。

答案 1 :(得分:2)

要完成这项工作,您应该维护一个包含以下内容的表:

  • 产品
  • 供应商
  • LatestPrice

然后通过查询该表来识别当前最佳供应商 - 您可以在请求时执行此操作,也可以在更新表时以任何方式更新表格,并以稍微复杂的架构和查询为代价来简化问题

补充(以下评论):

好的,这意味着您需要存储更多数据 - 但您没有大量选择 - 需要数据来解决问题,因此您要么:a)必须更新所有价格供应商同时然后从该快照中选择最优价格或b)在您获得价格时存储价格并从您获得的数据中选择最优价格。前者意味着在获取和处理数据方面需要相当大的开销,而后者基本上是一个相当适度的存储问题,而且任何体面的数据库都可以轻松应对。

答案 2 :(得分:1)

基本上,问题是您只存储来自1个供应商的最低价格。您必须保留所有供应商的价格记录,并使用选择查询来选择最小值。

例如,如果您有:

A123 22.5 Amazon

你得到了:

A123 23 Merlin

你必须插入它,即使价格较高,因为它是一个不同的供应商。所以你会:

A123 22.5 Amazon
A123 23 Merlin

当您从亚马逊获得新价格时,例如:25,您只需更新它。所以你会得到:

A123 25 Amazon
A123 23 Merlin

然后在这种情况下选择最低价格,Merlin。