Как избавиться от дубликатов в Left Join?

У меня есть таблица RaspisanieZanyatij:

id  KursNazvanie             VremyaNachala
1   Matematica                1300000000
5   БазоваяИнформатика        1312345678
6   Биология                  1318765432
4   География                 1322222222
2   История                   1300000000
3   Литература                1311111111

Я хочу вывести, чтобы значения шли таким образом:

1300000000  1311111111
1311111111  1312345678
1312345678  1318765432
1318765432  1322222222
1322222222  NULL 

То есть я хочу вывести "значение - значение, немного большее"

Но мой код:

SELECT DISTINCT
    --i1.id,
    i1.VremyaNachala AS time,
    i2.VremyaNachala AS greater_time
FROM
    RaspisanieZanyatij AS i1
    LEFT JOIN  RaspisanieZanyatij AS i2 ON   i2.VremyaNachala > i1.VremyaNachala

Выдаёт дубликаты:

1300000000  1311111111
1300000000  1312345678
1300000000  1318765432
1300000000  1322222222
1311111111  1312345678
1311111111  1318765432
1311111111  1322222222
1312345678  1318765432
1312345678  1322222222
1318765432  1322222222
1322222222  NULL

Как можно исправить код, чтобы убрать дубликаты слева и выводить лишь наименьшее большее справа ?


Ответы (1 шт):

Автор решения: Akina
SELECT DISTINCT t1.VremyaNachala, t2.VremyaNachala
FROM RaspisanieZanyatij t1
LEFT JOIN RaspisanieZanyatij t2 ON t1.VremyaNachala < t2.VremyaNachala
WHERE NOT EXISTS ( SELECT NULL 
                   FROM RaspisanieZanyatij t3
                   WHERE t1.VremyaNachala < t3.VremyaNachala
                     AND t3.VremyaNachala < t2.VremyaNachala )

или

SELECT t1.VremyaNachala, MIN(t2.VremyaNachala) VremyaNachala
FROM RaspisanieZanyatij t1
LEFT JOIN RaspisanieZanyatij t2 ON t1.VremyaNachala < t2.VremyaNachala
GROUP BY t1.VremyaNachala

и ещё куча вариантов...

→ Ссылка