для твоего нет.один и нет.два вопроса, это мое предложение для (я полагаю, вы используете MySQL):
SELECT
`document_id`,
SUBSTR(GROUP_CONCAT(RPAD(`status_code`,5) ORDER BY `timestamp` DESC), 1, 5) AS `last_status`,
SUBSTR(GROUP_CONCAT(RPAD(`status_code`,5) ORDER BY `timestamp` DESC), 7, 5) AS `prev_status`,
UNIX_TIMESTAMP(SUBSTR(GROUP_CONCAT(FROM_UNIXTIME(`timestamp`) ORDER BY `timestamp` DESC), 1, 19)) AS `last_timestamp`,
UNIX_TIMESTAMP(SUBSTR(GROUP_CONCAT(FROM_UNIXTIME(`timestamp`) ORDER BY `timestamp` DESC), 21, 19)) AS `prev_timestamp`
FROM `log`
GROUP BY `document_id`
HAVING `last_timestamp` - `prev_timestamp` > 60*10 AND `last_status` IN (100,200);
Хорошо, что там происходит.Мы группируем строки по document_id и упорядочиваем коды состояния и временные метки внутри GROUP_CONCAT для получения последней и предварительной записи.
Если ваш код состояния может содержать более 5 цифр, то замените его RPAD (status_code
, X), где X - максимальное число кодов длины status_
60 * 10 - это 10 минут
last_status
IN (100,200) - коды состояния, которые вы хотите получить только.