Rails 5: Сортировка по дате, ЗАТЕМ группировка по столбцу

Это мой пример таблицы истории.

id |    time   | price
1  | 1-02-17   | 15.99
1  | 1-03-17   | 15.99
1  | 1-04-17   | 15.99
1  | 1-05-17   | 20.99
1  | 1-06-17   | 20.99
1  | 1-07-17   | 15.99
1  | 1-08-17   | 15.99

Я хочу получить вывод, подобный этому:

1-02-17 | 15.99
1-05-17 | 20.99
1-07-17 | 15.99

По сути, я хочу сгруппировать цены ПОСЛЕ сортировки по дате.

Можно ли это сделать с помощью рельсов?


person Phil Emerson    schedule 24.07.2017    source источник
comment
Это нормально, что идентификатор всегда равен 1? Идентификатор должен быть уникальным, поэтому для меня это странно. Если я правильно понимаю, что вы пытаетесь сделать, это: найти для каждой цены ее самую низкую дату. Правильный?   -  person Stephane Paquet    schedule 25.07.2017
comment
@StephanePaquet Это идентификатор продукта, поэтому здесь он не уникален. Я в основном проверяю цену продукта с идентификатором 1 каждый день, а затем хочу построить график. Чтобы отобразить это, мне нужен приведенный выше вывод.   -  person Phil Emerson    schedule 25.07.2017
comment
Но почему 1-02-17 с 15.99, а не 1-03-17? Вы пытаетесь найти самую раннюю дату для каждой цены, как думает @StephanePaquet? Возможно, вы захотите взглянуть на оконные функции, если это то, что вы пытаетесь сделать.   -  person mu is too short    schedule 25.07.2017
comment
@muistooshort То, что мне действительно нужно, - это просто способ исключить повторные цены. Я хочу, чтобы продукт стоил 15,99 долларов США с 02.02.17 по 04.01.17, 20,99 долларов с 05.01.17 по 06.01.17 и 15,99 долларов с 07.01.17. 08.01.17, чтобы данные можно было представить в виде графика.   -  person Phil Emerson    schedule 25.07.2017


Ответы (1)


Если количество ценовых пунктов невелико, вы можете получить записи из базы данных и сделать это:

price_ranges, prev_price = {}, nil
ProductHistory.where(product_id: 1).order(:date).find_each do |history|
 price_ranges[history.date] = history.price if history.price != prev_price
 prev_price = history.price
end

В конце этого цикла вы получите:

{ "1-02-17": 15.99, "1-05-17": 20.99, "1-07-17": 15.99 }

Примечание: ключ будет Date объектом вместо строки, если столбец БД в datetime.

Если количество записей велико, я бы предложил сделать это в вашей базе данных. Этот вопрос очень похож на ваш вариант использования, и если у вас есть mysql, вы можете использовать его самостоятельно Как удалить только непрерывные дубликаты, но не все дубликаты в запросе на выборку (MySQL)?

person Vijay Agrawal    schedule 25.07.2017