2015-01-26 3 views
0

Есть ли возможность получить самое близкое значение ниже определенного значения с помощью групповой функции без объединения?Получите самое близкое значение ниже определенного значения и группы по

date   productId stock 
2014-12-27 1   10 
2014-12-31 1   20 
2015-01-05 1   30 
2014-12-28 2   10 
2015-01-04 2   20 

Значение является, например, дата и должна быть ниже, чем 2015-01-01, но самое высокое значение даты и результат должен быть заказан фондовой мешочка, поэтому результат должен быть:

date   productId stock 
2014-12-28 2   10 
2014-12-31 1   20 

Конечно, это может быть решено с соединением, но объединение в больших таблицах медленнее, не так ли?

+0

Нет, это не правильно, так как меня интересует стоимость акций, которая может быть чем угодно. – Stefan

+0

жаль, что я принял это быстрее, чем прочитал. можете ли вы разместить свой sql, что вы пробовали и т. д., чтобы уточнить? –

+0

Я изменил несколько дат, чтобы сделать его более понятным. Я мог только представить себе решение с помощью SELECT product_id, акции из таблицы LEFT JOIN (SELECT product_id, акции FROM table WHERE date <'2015-01-01' LIMIT 0,1) в качестве table2 ON table.product_id = table2.product_d' , но это медленный запрос на большой таблице. – Stefan

ответ

2

Вы ищете последний день 2014 года, похоже, для каждого отдельного идентификатора продукта.

Вы делаете это с

   SELECT MAX(date) date, product_id 
       FROM yourtable 
       WHERE date < '2015-01-01' 
      GROUP BY product_id 

Это дает вам коллекцию date, product_id. Компонентный индекс на (date, product_id) сделает этот запрос очень эффективным для оценки.

Тогда вы join, что на ваш основной стол, как, например.

SELECT a.* 
    FROM yourtable AS a 
    JOIN (
      SELECT MAX(date) date, product_id 
       FROM yourtable 
       WHERE date < '2015-01-01' 
      GROUP BY product_id 
     ) AS b USING(date,product_id) 
ORDER BY a.product_id, a.date 

и извлекает подробные записи для последнего пункта в 2014 г. Тот же индекс соединения ускорит JOIN.

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

+0

Спасибо за подробный ответ, я действительно беспокоился о производительности, но лучшего решения нет. Еще один вопрос: таблица содержит 5 столбцов, AI, столбец даты и 3 внешних ключа. Это зависит от запроса, но иногда я получаю комбинацию product_id и даты и других времен color_id и даты. Лучше ли сделать два составных индекса (date, product_id & date, color_id) всего одного индекса на дату, поскольку product_id и color_id уже являются индексами? – Stefan

+0

@Stefan, для удовлетворения такого запроса быстро необходим правильный составной индекс покрытия. Индекс с одним столбцом на 'color_id' не поможет этому типу запросов. Вы должны прочитать оптимизацию «GROUP BY», чтобы получить фон. http://dev.mysql.com/doc/refman/5.6/en/group-by-optimization.html –

+0

Я понимаю, что один, но действительно ли важно получить составной индекс на дату, а product_id - два отдельных индекса на дату, а product_id также правильный? – Stefan

Смежные вопросы