【问题标题】:Select with grouping by year and month with special order以特殊顺序按年和月分组选择
【发布时间】:2014-07-21 19:48:10
【问题描述】:

我有一个带有行的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,这是最小的。

【问题讨论】:

    标签: mysql sql datetime group-by


    【解决方案1】:

    你可以使用这个查询:

    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。子查询将计算每个月的最小计划日期,然后我将使用每个月的最小计划日期加入事件表。

    【讨论】:

    • 好答案,所以我会选择这个,因为它首先发布并且更漂亮。谢谢
    【解决方案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`
    

    【讨论】:

    • 你为什么使用year(schedule) * 100* 100 部分的目的是什么?
    • 只是将年份和月份组合在一个字段中,因此 2014 年 6 月将是 201406。
    猜你喜欢
    • 1970-01-01
    • 2013-08-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-21
    • 1970-01-01
    • 2011-07-21
    • 2021-10-16
    相关资源
    最近更新 更多