LINUX.ORG.RU

SQL запрос

 ,


0

1

Помогите гуманитарию) Есть табличка примерно такая

Name   | Month    | Year | Date
---------------------------------------------
Вася  |    12     | 2012 | 2013-01-11
Вася  |     1     | 2013 | 2013-02-02
Петя  |     1     | 2013 | 2013-02-05
Коля  |     1     | 2013 | 2013-02-10
Вася  |     2     | 2013 | 2013-03-05
Вася  |     3     | 2013 | 2013-04-03
Коля  |     2     | 2013 | 2013-03-15
Мне нужно выбрать для каждого имени одну строку с максимальным месяцем в указанном году.
Т.е. получить
Name   | Month    | Year | Date
---------------------------------------------
Вася  |    12     | 2012 | 2013-01-11
для 2012 года
и
Name   | Month    | Year | Date
---------------------------------------------
Петя  |     1     | 2013 | 2013-02-05
Вася  |     3     | 2013 | 2013-04-03
Коля  |     2     | 2013 | 2013-03-15
для 2013
Запрос
SELECT t.Name, MAX(t.Month)
FROM t
GROUP BY t.Name
ORDER BY t.Name
замечательно работает для двух столбцов, но при добавлении даты в запрос все портится.

★★★

Последнее исправление: CYB3R (всего исправлений: 1)

ты такое хочешь получить?

Name 	MAX(t.Month) 	year 	date
vas 	12 	2012 	2013-01-11
kol 	2 	2013 	2013-02-10
pet 	1 	2013 	2013-02-05
vas 	3 	2013 	2013-02-02

ну так добавь группировку по годам

anonymous
()

при добавлении даты в запрос все портится

Правильно. Ты же не говоришь «для каждого имени и даты», а говоришь «выбрать всю строку, где месяц в строке соответсвует макимальному для данного имени». Переводим буквально:

SELECT * FROM
t WHERE (Name, Month) IN 
(SELECT Name, MAX(Month)
  FROM t
  GROUP BY t.Name
  ORDER BY t.Name)

Ну или для более старых SQL:

SELECT t1.* FROM
t as t1, t as t2 
WHERE t1.Name = t2.Name and t1.Year = t2.Year 
  GROUP BY t1.Name, t1.Month, t1.Date, t1.Year, t2.Name, t2.Year
  ORDER BY t1.Name
  HAVING t1.Month = MAX(t2.Month)

monk ★★★★★
()

Mожно вот так:

select t.* 
from   t
       inner join (select Name,
                          Year,
                          max(Month) Max_month 
                   from   t
                   group by Name, Year
                  ) t_max
           on t_max.Name = t.Name
              and t_max.Year = t.Year 
              and t_max.Max_month = t.Month

Byron
()
Последнее исправление: Byron (всего исправлений: 2)
Ответ на: комментарий от Byron

Спасибо, воспользовался этим вариантом.

yirk ★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.