GROUP BY на дату, с упорядочением по дате - PullRequest
0 голосов
/ 14 мая 2010

Возьмите этот простой запрос:

SELECT DATE_FORMAT(someDate, '%y-%m-%d') as formattedDay<br> FROM someTable<br> GROUP BY formatterDay

Это позволит выбрать строки из таблицы, содержащие только 1 строку на дату.
Как убедиться, что строка выбрана на датусамый ранний на эту дату, без выполнения заказанного подзапроса в ОТ?

Приветствия

Ответы [ 2 ]

1 голос
/ 14 мая 2010

Если вы используете MySQL, нет способа сделать то, что вы хотите, в одном выборе. Вам потребуется внутренний запрос, который выбирает минимальный идентификатор и форматированное или другое поле для каждой отформатированной даты. Затем вы снова присоединяетесь к родительской таблице и выбираете записи с минимальным идентификатором.

В других базах данных (postgresql, oracle, db2) есть оконные функции, которые позволяют сделать это за один выбор (т. Е. 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) и его временную метку. Если с одной и той же отметкой времени может появиться более одной записи, вам потребуется выполнить операцию дважды. Сначала получите минимальную дату в день, затем минимальный идентификатор за минимальную дату.

0 голосов
/ 14 мая 2010

Я бы переписал ваш запрос так:

SELECT distinct DATE_FORMAT(someDate, '%y-%m-%d') as formattedDay
  FROM someTable
 ORDER BY DATE_FORMAT(someDate, '%y-%m-%d') 

Если вам абсолютно необходима группировка по (т.е. вы используете агрегатную функцию, которую вы нам не показываете), просто сделайте:

SELECT DATE_FORMAT(someDate, '%y-%m-%d') as formattedDay
  FROM someTable
 GROUP BY DATE_FORMAT(someDate, '%y-%m-%d')
 ORDER BY DATE_FORMAT(someDate, '%y-%m-%d') -- this is redundant, but you can use another column here
...