选择每个组的最近日期,但必须在连续的日期进行分组

时间:2018-09-04 18:37:50

标签: mysql sql date datetime

如何将相邻的行按一个列值分组,以便仅返回这些分组行中的最新行?

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

提琴手:http://sqlfiddle.com/#!9/02033ba/15

1 个答案:

答案 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

Revised SQL Fiddle