2016-11-28 3 views
0

Я пытаюсь получить из таблицы статистики последнюю запись с последнего дня каждого клиента. Я хочу выбрать клиента с наиболее проданными предметами за последний день.Выберите из числа всех клиентов последнюю запись в Rails

Статистика генерируется каждый час, поэтому у пользователя есть несколько статистических данных, но мне нужен только последний.

Я пробовал несколько команд, я просто получаю ошибки.

Statistic.where("created_at < ?",1.day.ago).select(:customer_id).distinct.order(created_at: :desc) 

или

Statistic.where("created_at < ?",1.day.ago).select(:customer_id).distinct.last 

является лучшим решением с потрохами? Или я должен создать 2 выбора? Я понятия не имею, где разместить «sold_items».

это тоже может быть решением, но я не уверен.

Customer.all.each do |customer| 
    stats = customer.statistics.where("created_at < ?",Date.today).last 
    count = stats.sold_items if stats.sold_items > count 
    best = customer if count = stats.sold_items 
end 

Модель: клиент has_many: статистика - статистика belongs_to: клиент

+0

не могли бы вы добавить объявления модели? , чтобы ваш первый запрос работал, вы должны сделать соединение. так что второй. – marmeladze

+0

У вас есть отношение 'has_many'' принадлежит_to' между вашими 'Customer' и' Statistic'? – sa77

+0

Справа. Клиент has_many: статистика и статистика принадлежит_to: customer –

ответ

1
Statistic.joins("inner join (select customer_id,max(created_at) as created_at from statistics group by customer_id) as stats2 on statistics.customer_id = stats2.customer_id and statistics.created_at = stats2.created_at").pluck("max(statistics.sold_items)") 

Это даст вам максимум продал детали от клиента, который продал большинство предметов в последний день до сих пор,

Позвольте мне провести вас через это,

В основном, в первую очередь вам нужна последняя статистика для каждого клиента. то вам нужно получить maximum из sold_items из этой статистики.

Так Вложенный запрос (select customer_id,max(created_at) as created_at from statistics group by customer_id) выбирает максимальную created_at для каждого клиента, то внешний запрос присоединяется к фактическому statistics с этими результатами и выбрав только те, которые подпадают под последними критериями даты. то в конце pluck("max(statistics.sold_items)") выберите максимальные sold_items из этих результатов.

HERE - это еще одна ссылка, которая находит самую последнюю запись из каждой группы.

+0

Вау, это здорово! Спасибо! –