选择按年份和月份分组,特殊订单

时间:2014-07-21 19:48:11

标签: mysql sql datetime group-by

我有一个包含行的events表,每个行都有schedule个日期时间列,如下所示:

---------------------------------------
|  id   |     schedule          | .....
---------------------------------------
|  234  |  2014-06-18 15:53:00  | .....
|   23  |  2014-06-11 08:02:00  | .....
|    1  |  2014-06-28 20:09:00  | .....
|  122  |  2014-06-24 07:54:00  | .....
|  125  |  2014-07-16 06:45:00  | .....
|  456  |  2014-07-06 08:24:00  | .....
|   54  |  2014-07-10 09:39:00  | .....
|    2  |  2014-08-02 19:08:00  | .....
|    8  |  2014-09-25 01:50:24  | .....
|   45  |  2014-09-04 08:41:51  | .....

所有行都是随机排列的。

我需要编写select语句,它将以这种方式产生结果:

------------------------------
| id  |   schedule   |
-----------------------------
|  23 |  2014-06-11  |
| 456 |  2014-07-06  |
|   2 |  2014-08-02  |
|  45 |  2014-09-04  |

那是:

1)结果集每个月只应包含一个条目;

2)每个日期应该是该月份的最小日期,即如果我们有2014-07-022014-07-24(所有日期最初都是随机顺序),那么应该出现的唯一条目本月的结果集应该是2014-07-02,这是最小的。

2 个答案:

答案 0 :(得分:2)

您必须使用子查询来获取每个月的最小值,然后使用它连接回主表。 SQL Fiddle

select
table1.`id`,
table1.`schedule`
from
table1
inner join 
(
select
(year(`schedule`) * 100) + month(`schedule`) as prd,
min(`schedule`) as schedule
from
table1
group by

(year(`schedule`) * 100) + month(`schedule`)) mins
on table1.`schedule` = mins.`schedule`

答案 1 :(得分:2)

您可以使用此查询:

SELECT events.*
FROM
  events INNER JOIN (SELECT MIN(schedule) min_schedule
                     FROM events
                     GROUP BY YEAR(schedule), MONTH(schedule)) m
  ON events.schedule = m.min_schedule
ORDER BY
  events.schedule

请参阅小提琴here。子查询将计算每个月的最小计划日期,然后我将每个月的最小计划日期加入事件表。