Как узнать последнюю дату каждого месяца [дубликаты]

0

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

ID  field1          field2          created_at
----------------------------------------------
1   40000.0000      70000.0000      2018-01-31
2   80000.0000      90000.0000      2018-02-28
3   10000.0000      30000.0000      2018-03-31
4   12000.0000      32000.0000      2018-04-30
5   212500.0000     312500.0000     2018-05-31
6   324000.0000     424000.0000     2018-06-30
7   122300.0000     222300.0000     2018-07-26
8   357772.2420     307600.9081     2018-07-31

Я придумал этот запрос, но он работает не так, как ожидалось.

SELECT id, field1, field2, MAX (created_at) AS created_at FROM my_table GROUP BY YEAR (created_at), MONTH (created_at) ORDER BY created_at ASC

Выход, который я получаю:

ID  field1          field2          created_at
----------------------------------------------
1   40000.0000      70000.0000      2018-01-31
2   80000.0000      90000.0000      2018-02-28
3   10000.0000      30000.0000      2018-03-31
4   12000.0000      32000.0000      2018-04-30
5   212500.0000     312500.0000     2018-05-31
6   324000.0000     424000.0000     2018-06-30
7   122300.0000     222300.0000     2018-07-31   <-- values from ID 7 but date from ID 8

Ожидаемый результат

ID  field1          field2          created_at
----------------------------------------------
1   40000.0000      70000.0000      2018-01-31
2   80000.0000      90000.0000      2018-02-28
3   10000.0000      30000.0000      2018-03-31
4   12000.0000      32000.0000      2018-04-30
5   212500.0000     312500.0000     2018-05-31
6   324000.0000     424000.0000     2018-06-30
8   357772.2420     307600.9081     2018-07-31

Как выбрать значения из той же записи, что и MAX(created_at)?

SQLFiddle

  • 0
    Что еще ты ожидаешь, Юрий? Когда вы группируете и используете агрегатную функцию, например, max для столбца, значение этого столбца будет контролироваться этой функцией. Но столбцы, которые вы не агрегируете иначе, выберут первое значение. Другими словами, говоря MySQL о выборе максимума create_at, вы также автоматически не указываете ему использовать максимум всех других столбцов, использующих select.
  • 0
    Вы правы, но я просто не знала, как с этим разобраться
Показать ещё 1 комментарий
Теги:
group-by

2 ответа

2
Лучший ответ

Вы можете попробовать следующее:

SELECT id, field1, field2, created_at AS created_at 
FROM 'my_values' 
where created_at in (select max(created_at)
                 FROM 'my_values' 
 GROUP BY YEAR(created_at), MONTH(created_at) ORDER BY created_at ASC )

См. SQLFiddle

  • 0
    Это работает, спасибо. Интересно, есть ли более элегантный способ добиться того же результата ..
1

используя соединение

select id, field1, field2,T2.created_at from my_values T1 
inner join 
(
select max(created_at) as created_at
                 FROM 'my_values' 
 GROUP BY YEAR(created_at), MONTH(created_at) ORDER BY created_at ASC
 ) as T2
 on T1.created_at=T2.created_at

http://sqlfiddle.com/#!9/4f7442/18

id  field1  field2  created_at
1   40000   70000   2018-01-31
2   80000   90000   2018-02-28
3   10000   30000   2018-03-31
4   12000   32000   2018-04-30
5   212500  312500  2018-05-31
6   324000  424000  2018-06-30
8   357772.242  307600.9081 2018-07-31

Ещё вопросы

Сообщество Overcoder
Наверх
Меню