В MySQL <8.0, где оконные функции недоступны, рассмотрим: </p>
SELECT t.*, t1.date next_date, DATEDIFF(t1.date, t.date) date_diff
FROM mytable t
INNER JOIN mytable t1
ON t1.client_id = t.client_id
AND DATEDIFF(t1.date, t.date) >= 30
AND NOT EXISTS (
SELECT 1
FROM mytable t2
WHERE
t2.client_id = t.client_id
AND t2.date > t.date
AND t2.date < t1.date
)
ORDER BY t.client_id, t.date
Этот запрос дает вам записи, следующая запись которых для того же клиента - более 30 дней спустя.Он работает путем самостоятельного присоединения к таблице и применения следующих условий:
- присоединенная запись должна принадлежать одному и тому же клиенту
- ее дата должна быть как минимум на 30 дней больше датытекущей записи
- не должно существовать другой записи для того же клиента, чья дата больше, чем дата текущей записи и меньше, чем datea объединенной записи (это реализует концепцию next запись)
Демонстрация на DB Fiddle :
Ваш пример данных (правильно отсортирован):
| id | client_id | date |
| --- | --------- | ---------- |
| 6 | 1001 | 2003-05-05 |
| 4 | 1001 | 2007-08-26 |
| 1 | 1001 | 2008-11-26 |
| 3 | 2001 | 2008-08-31 |
| 2 | 2001 | 2008-09-01 |
| 5 | 3001 | 2003-11-26 |
Результаты запроса:
| id | client_id | date | next_date | date_diff |
| --- | --------- | ---------- | ---------- | --------- |
| 4 | 1001 | 2007-08-26 | 2008-11-26 | 458 |
| 6 | 1001 | 2003-05-05 | 2007-08-26 | 1574 |