Сортировка внутри группировки

263
26 ноября 2016, 20:10

Таблица

id | usr | how | dt
-----------------------------
1  | 101 | 10  | 2016-10-16
-----------------------------
2  | 101 | 20  | 2016-10-16
-----------------------------
3  | 101 | 30  | 2016-10-17

Нужно сделать такой запрос:

SELECT id,how, MONTH(dt) AS `dt` FROM stat WHERE usr = '101' GROUP BY YEAR(dt), MONTH(dt)

Но выдаёт в группировке первые строки, типа id 1, а по сути надо id 3. ORDER BY id DESC не помогает

Пробовал так, но тоже нет

SELECT * from ( SELECT id,how, MONTH(dt) AS `dt` FROM stat WHERE usr = '101' ORDER BY id DESC) AS te GROUP BY YEAR(te.dt), MONTH(te.dt) ORDER BY te.id DESC
Answer 1

Большинство СУБД (и MySQL при включенной опции only_full_group_by) вообще бы выдали вам ошибку на такой запрос. Потому, что использовать в выводе колонки без групповых функций, не включенные в фразу group by нельзя (в MySQL можно, но результат непредсказуем). Необходимо явно объяснить SQL какое значение из нескольких в группе вы хотите получить.

Используйте агрегатные функции, например:

SELECT max(id) as id, max(how) as how, MONTH(dt) AS `dt`
  FROM stat WHERE usr = 101
 GROUP BY YEAR(dt), MONTH(dt)

А для получения последних (по id) записей каждого месяца можно сделать так:

select *
  from table A
  join (select max(id) from table where usr=101
         group by extract(year_month from dt)) B
    on A.id=B.id
READ ALSO
Почему (65='65ae3ee2-aeb2-427f-8381-56db91b94363') -> TRUE?

Почему (65='65ae3ee2-aeb2-427f-8381-56db91b94363') -> TRUE?

Запрос SELECT * FROM families WHERE id = '65ae3ee2-aeb2-427f-8381-56db91b94363' OR fam_code = '65ae3ee2-aeb2-427f-8381-56db91b94363' возвращает две записи:

218
Условие на подсчет limit

Условие на подсчет limit

Имеется столбец вида

284
Получение данных из внешней базы в Rails №2

Получение данных из внешней базы в Rails №2

По ссылке уже задавал вопросВсе получилось, но

244