Чтобы выбрать записи из таблицы `monitoring`, которые содержат максимальные значения поля `value` за каждый день, можно воспользоваться оконными функциями или подзапросами. В данном случае, мы можем воспользоваться функцией `GROUP BY` с применением `MAX` в сочетании с `JOIN`, чтобы получить полные записи.
Вот пример запроса, который делает это:
```sql
SELECT m.*
FROM monitoring m
JOIN (
SELECT DATE(created_at) AS day, MAX(value) AS max_value
FROM monitoring
GROUP BY DATE(created_at)
) AS max_values
ON DATE(m.created_at) = max_values.day AND m.value = max_values.max_value
ORDER BY m.created_at;
```
### Объяснение запроса:
1. **Подзапрос (`max_values`)**:
- Мы выбираем дату (без учета времени) из поля `created_at` и максимальное значение поля `value` для каждой даты.
- Используем `GROUP BY DATE(created_at)` для группировки по дате.
2. **Основной запрос**:
- Мы запрашиваем все поля из таблицы `monitoring`.
- Используем `JOIN`, чтобы соединить оригинальную таблицу с подзапросом по дате и максимальному значению.
- Сравниваем дату `DATE(m.created_at)` с `max_values.day` и значение `m.value` с `max_values.max_value`.
3. **Сортировка**:
- В конце идёт `ORDER BY m.created_at`, чтобы отсортировать вывод по времени создания записей.
Этот запрос вернёт все записи с максимальными значениями за каждый день с временным диапазоном от 00:00:00 до 23:59:59. Если есть несколько записей с одинаковым максимальным значением за один день, он вернёт все такие записи.