按日期分组,按日期排序

时间:2010-05-14 10:58:59

标签: mysql group-by sql-order-by

采取这个简单的查询:

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

这将从表中选择每行只有1行的行 如何确保每个日期选择的行是该日期最早的行,而不在FROM中执行有序的子查询?

干杯

2 个答案:

答案 0 :(得分:1)

如果您使用的是MySQL,则无法在单个选择中执行您想要的操作。您需要一个内部查询,为每个格式化日期选择最小ID和格式化或其他字段。然后再次将其加入父表,并选择具有最小ID的记录。

在其他数据库(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(someDate)的MIN(ID)及其时间戳。如果可以使用相同的时间戳显示多个记录,则需要执行两次操作。首先获得每天的最短日期,然后是每个最小日期的最低ID。

答案 1 :(得分:0)

我会像这样重写你的查询:

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

如果您绝对需要分组(I.E.您使用的是您未向我们展示的汇总功能),请执行以下操作:

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