之前已经多次询问过这个问题,但我的情况有点不同。
说我有这些数据:
------------------------------
| 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
子句放在一起的相同值的行组合在一起。
我该怎么做?
答案 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
将得到你想要的东西。