Я люблю такие вещи, как это. Похоже, это сложнее, чем предлагали оба других ответа. Вот решение, которое будет работать. Мои извинения за неприятное форматирование. Кроме того, это будет работать в SQL Server, но я не использовал Access вечно, поэтому вам, возможно, придется немного его настроить, чтобы он работал там. Или он может вообще не работать, если Access не поддерживает неэквинозы.
SELECT productId, MAX(tbl.TimeBetween)
FROM
(SELECT status_1.productId as productId, status_1.statusDate as status1Date, MIN(status_3.statusDate) as status3Date, DATEDIFF(m,status_1.statusDate, MIN(status_3.statusDate)) as TimeBetween
FROM
(SELECT productId, status, statusDate
FROM log
WHERE status = '01') status_1
INNER JOIN
(SELECT productId, status, statusDate
FROM log
WHERE status = '03') status_3
ON status_1.productId = status_3.productId AND status_3.statusDate > status_1.statusDate
GROUP BY status_1.productId, status_1.statusDate) tbl
GROUP BY productId, status3Date
ORDER BY productId, TimeBetween
- Самый внутренний выбор получает записи для каждого статуса.
- Затем они объединяются, чтобы получить статусные записи «03», которые больше, чем соответствующие им записи «01» (как часто вы можете использовать неэквиджойн?)
- Затем они фильтруются, чтобы получить запись MIN '03', которая все еще идет после соответствующей записи '01'.
- Самый внешний выбор принудительно применяет ваше «первое достижение статуса правила« 01 », поскольку он может переходить в статус« 01 »несколько раз, прежде чем достигнет статуса« 03 ».
Если у кого-то есть более элегантное решение, я бы хотел его увидеть. В прошлом мне приходилось писать подобные запросы, и я бы хотел найти лучшее решение для такого рода проблем.