Выбор минимальной цены - PullRequest
       16

Выбор минимальной цены

0 голосов
/ 17 декабря 2009

Ситуация выглядит так:

У нас есть продукт «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

В таблице продуктов у нас есть

A123 22.5 amazon

затем снова приходит информация от Amazon:

A123 25 amazon

Благодаря вышеупомянутому условию мы обновляем цену до более высокой, что является правильным поведением.

Но в этой ситуации алгоритм не работает: снова у нас есть строка в таблице продуктов:

A123 22.5 amazon

потом приходит информация от мерлина

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

затем приходит информация от Amazon

A123 35 amazon

и мы обновляем таблицу, и теперь у нас есть:

A123 35 amazon

но это неправильно, потому что ранее у merlin была более низкая цена на этот продукт.

Есть идеи, как избежать этой ситуации?

Ответы [ 3 ]

3 голосов
/ 17 декабря 2009

Единственный способ решить вашу проблему - отслеживать цену за магазин, а затем возвращать только самую низкую текущую цену. Так, например, вам понадобится таблица, подобная той, которая у вас уже есть, но когда вы выбираете из таблицы что-то вроде:

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

Лично, если бы это был я, я бы сохранил отметку о времени, когда вы будете получать обновления цены продукта, чтобы вы могли определить, когда вы получили обновление.

2 голосов
/ 17 декабря 2009

Для выполнения этой работы вы должны вести таблицу, которая содержит следующее:

  • Продукт
  • Поставщик
  • LatestPrice

Затем определите лучшего поставщика на данный момент, запросив эту таблицу - вы можете сделать это по запросу или при обновлении таблицы, либо упростить задачу ценой более сложной схемы и запросов

Дополнительно (следующий комментарий):

Хорошо, это будет означать, что вам нужно хранить больше данных - но у вас нет большого количества выбора - данные необходимы для решения проблемы, поэтому вы должны: а) обновить цены со всех поставщики одновременно, а затем выбирают лучшую цену из этого снимка или б) сохраняют цены по мере их поступления и выбирают лучшую цену из имеющихся у вас данных. Первое подразумевает довольно большие издержки с точки зрения извлечения и обработки данных, в то время как второе в основном представляет собой довольно скромную проблему хранения, с которой легко справятся любые приличные базы данных.

1 голос
/ 17 декабря 2009

По сути, проблема в том, что вы храните только самую низкую цену от 1 продавца. Вы должны вести учет цен всех поставщиков и использовать запрос выбора для выбора минимума.

Например, если у вас есть:

A123 22.5 Amazon

и вы получили:

A123 23 Merlin

Вы должны вставить его, даже если это по более высокой цене, потому что это другой поставщик. Итак, у вас будет:

A123 22.5 Amazon
A123 23 Merlin

Когда вы получаете новую цену от Amazon, например: 25, вы просто обновляете ее. Итак, вы получите:

A123 25 Amazon
A123 23 Merlin

затем выберите самую низкую цену, Merlin, в этом случае.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...