Я считаю, что лучший способ думать об этих странных запросах - разбить их на более мелкие управляемые запросы. Итак, я думаю об этом как о первом сопоставлении, а затем о сравнении двух записей: «текущих» и «следующих» записей. Первое, что мы хотим сделать, - это связать каждую запись (которая станет «текущей») с соответствующей «следующей» записью.
Итак, во-первых, запрос, который получает все идентификаторы записей и соответствующие им «следующие записи». При этом используется выражение «<» в выражении JOIN для получения всех записей, следующих за текущей записью. </p>
SELECT
T.id as currentId,
MIN(A.id) as nextId
FROM
rec_completionDate as T
JOIN
rec_completionDate as A ON T.itemNumber = A.itemNumber and T.id < A.id
GROUP BY
T.id
Выполните запрос, который, используя вышеуказанное в качестве подзапроса, возвращает все соответствующие поля для каждой записи (текущей и следующей):
SELECT
current.*,
next.*
FROM
( ... [subquery goes here] ...) sq
JOIN
rec_completionDate as current ON sq.currentId = current.id
JOIN
rec_completionDate as next ON sq.nextId = next.id
Наконец, мы хотим ограничить результаты этого последнего запроса следующим предложением WHERE:
WHERE
next.completedDate > current.nextDue
Итак, все вместе:
SELECT
current.*,
next.*
FROM
(
SELECT
T.id as currentId,
MIN(A.id) as nextId
FROM
rec_completionDate as T
JOIN
rec_completionDate as A ON T.itemNumber = A.itemNumber and T.id < A.id
GROUP BY
T.id
) sq
JOIN
rec_completionDate as current ON sq.currentId = current.id
JOIN
rec_completionDate as next ON sq.nextId = next.id
WHERE
next.completedDate > current.nextDue