2013-12-07 4 views
1

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

Например, моя таблица имеет:

id, date, item, quantity 

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

Что-то вроде:

1, (July datetime), Banana, 5 
3, (July datetime), Apple, 2 
4, (August datetime), Banana, 6 
8, (August datetime), Apple, 8 

Спасибо за любую помощь !!

То, что я пытался до сих пор это:

SELECT t1.* 
FROM inventory t1 
WHERE t1.date = (SELECT MAX(t2.date) 
      FROM inventory t2 
      WHERE t2.item = t1.item) 

Это будет, конечно, показать самую последнюю строку для каждого элемента ... но не для каждого месяца.

+0

Что вы пробовали? Если вы не хотите ничего делать самостоятельно, каков ваш бюджет? – h2ooooooo

+2

Ну, если вы хотите его по месяцам, вам нужно сгруппировать по YEAR (t2.Date) и MONTH (t2.Date) в свой суб-выбор. Также t1.date = (sub-select) не будет работать, я предлагаю изучить предикат существования. – akaphenom

+0

Ну, это что-то вроде SELECT что-то от да ничего, – Strawberry

ответ

0

MySQL GROUP BY расширение позволяет сделать это в следующим образом

SELECT id, date, item, quantity 
    FROM 
(
    SELECT id, date, item, quantity 
    FROM inventory 
    ORDER BY item, date DESC 
) q 
GROUP BY YEAR(date), MONTH(date), item 

Более стандартный способ будет тянуть дата MAX за единицу в месяц первый, а затем присоединиться назад к inventory, чтобы захватить все другие поля

SELECT i.id, i.date, i.item, i.quantity 
    FROM 
(
    SELECT item, MAX(date) date 
    FROM inventory 
    GROUP BY item, YEAR(date), MONTH(date) 
) q JOIN inventory i 
    ON q.item = i.item 
    AND q.date = i.date 
ORDER BY YEAR(i.date), MONTH(i.date), i.item 

Вот SQLFiddle демо

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