我有一个包含行的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-02
和2014-07-24
(所有日期最初都是随机顺序),那么应该出现的唯一条目本月的结果集应该是2014-07-02
,这是最小的。
答案 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。子查询将计算每个月的最小计划日期,然后我将每个月的最小计划日期加入事件表。