Если вы используете MySQL, вы не сможете делать то, что хотите, в одном выборе. Вам понадобится внутренний запрос, который выбирает минимальный идентификатор и форматированное или другое поле для каждой форматированной даты. Затем снова присоедините его к родительской таблице и выберите записи с минимальным идентификатором.
В других базах данных (postgresql, oracle, db2) есть функции окон, которые позволяют сделать это в одном select (то есть DENSE_RANK() OVER ...).
Вот пример с внутренним запросом (который вы можете уже быть в курсе):
SELECT B.formattedDay, A.*
FROM someTable A
JOIN
(
SELECT DATE_FORMAT(someDate, '%y-%m-%d') as formattedDay,
MIN(ID) as firstId
FROM someTable I
GROUP BY 1
) B ON (A.ID = B.firstId)
Изменение MIN (ID) для MIN (someDate) при необходимости и его метку времени. Если может отображаться более одной записи с одинаковой временной меткой, вам необходимо выполнить операцию дважды. Сначала получают минимальную дату в день, затем минимальный ID за минимальную дату.
Спасибо. Я смог сделать это с помощью внутреннего запроса, но задавался вопросом, есть ли способ сделать это без него. Вы ответили на этот вопрос. :) –
Хотелось бы, я пропустил возможность генерировать плотный столбец рангов, а затем просто выбирать строки, где dense_rank равен 1. Ну ладно, по крайней мере, MySql быстр. Приветствия. – Gennadiy