GROUP BY之前的SQL ORDER BY

时间:2016-12-06 08:11:36

标签: mysql sql sql-order-by

之前已经多次询问过这个问题,但我的情况有点不同。

说我有这些数据:

------------------------------
| id       | date            |
------------------------------
| 1        | 2016-07-15      |
| 1        | 2016-07-16      |
| 2        | 2016-07-24      |
| 2        | 2016-07-25      |
| 1        | 2016-07-29      |
| 1        | 2016-07-30      |
------------------------------

我想先按date列进行排序,然后按id列进行分组,并为每个max(date)id

所以我会得到这个

------------------------------
| id       | max(date)       |
------------------------------
| 1        | 2016-07-16      |
| 2        | 2016-07-25      |
| 1        | 2016-07-30      |
------------------------------

请注意,id=1出现两次,因为订单会导致2个单独的"组" id=1的{​​{1}},其中包含一组id=2

我的意思是我希望group by函数只将由order by子句放在一起的相同值的行组合在一起。

我该怎么做?

1 个答案:

答案 0 :(得分:4)

我认为你应该在这里使用变量。

select id, `date`
from (
    select 
        id, 
        `date`, 
        @rowno := case when @grp = id then @rowno + 1 else 0 end as rowno,
        @grp := id
    from (
        select *
        from yourtable
        order by `date` desc
    ) t1
    cross join (select @grp := null, @rowno = 0) t2
) main
where main.rowno = 0
order by `date`;

内部查询将组织这样的记录,

---------------------------------------------
| id       | date            | rowno | @grp |
---------------------------------------------
| 1        | 2016-07-30      | 0     | 1    |
| 1        | 2016-07-29      | 1     | 1    |
| 2        | 2016-07-25      | 0     | 2    |
| 2        | 2016-07-24      | 1     | 2    |
| 1        | 2016-07-16      | 0     | 1    |
| 1        | 2016-07-15      | 1     | 1    |
---------------------------------------------

然后where子句rowno = 0将得到你想要的东西。

SQLFiddle Demo