这个问题在这里已经有答案了:
如何在mysql中选择最大值(column value)的行,并用另一列进行分区(20个答案)
10个月前关门了。
我有一张如下的table:
id | description | expiration date
------------------------
1 | ............| 2016-02-09 00:00:00
------------------------
1 | ............| 2099-09-09 00:00:00
------------------------
1 | ............|
------------------------
2 | ............| 2016-02-09 00:00:00
------------------------
2 | ............| 2099-09-09 00:00:00
------------------------
3 | ............| 2099-09-09 00:00:00
如果一个id出现多次,则会保留一个没有过期日期的id,如id1。但在id2中,两个记录都有过期日期,编号较大的记录将被保留。因此,每个id只有一行,结果将是:
id | description | expiration date
------------------------
1 | ............|
------------------------
2 | ............| 2099-09-09 00:00:00
------------------------
3 | ............| 2099-09-09 00:00:00
它很容易用编程语言实现,但我不能编写一个优雅的sql命令。谢谢。
1条答案
按热度按时间vh0rcniy1#
你可以用
row_number()
```select * from
(
select id, description,expiration_date,
row_number() over(partition by id order by case when expiration_date is null then 1 else 2 end asc, expiration_date desc) as rn
from tablename
)A where rn=1