如何将相邻的行按一个列值分组,以便仅返回这些分组行中的最新行?
travel
表中的数据
id name location date
--------------------------------------------
1 name London 2018-09-01 00:00:00
2 name London 2018-09-02 00:00:00
3 name NYC 2018-09-03 00:00:00
4 name London 2018-09-04 00:00:00
5 name NYC 2018-09-05 00:00:00
6 name NYC 2018-09-06 00:00:00
7 name Tokyo 2018-09-07 00:00:00
结果(顺序颠倒)
7 name Tokyo 2018-09-07 00:00:00
6 name NYC 2018-09-06 00:00:00
4 name London 2018-09-04 00:00:00
3 name NYC 2018-09-03 00:00:00
2 name London 2018-09-02 00:00:00
答案 0 :(得分:1)
使用双NOT EXISTS
。简而言之,请选择所有行,但将来那些相同位置且之间没有其他位置的行除外。
SELECT *
FROM travel curr
WHERE NOT EXISTS (
SELECT 1
FROM travel next
WHERE next.name = curr.name
AND next.location = curr.location
AND next.date > curr.date
AND NOT EXISTS (
SELECT 1
FROM travel inbw
WHERE inbw.name = curr.name
AND inbw.location <> curr.location
AND inbw.date > curr.date
AND inbw.date < next.date
)
)
ORDER BY date DESC