Хммм.Ваш запрос выглядит следующим образом:
SELECT dtls_info,
status,max(emp_id) -- COUNT(DISTINCT emp_id)
FROM (SELECT status, dtls_info, emp_id
FROM (SELECT e.*, MAX(emp_id) OVER () AS max_emp_id
FROM emp e
) e
WHERE emp_id >= max_emp_id - 200000 AND
modif_date > sysdate - 1 / 24
) e
WHERE emp_id >= (select min(emp_id) from emp)
GROUP BY status, dtls_info;
Внешний where
является несущественным (если emp_id
не может быть NULL
. Это упрощает запрос до:
SELECT dtls_info, status, max(emp_id) -- COUNT(DISTINCT emp_id)
FROM (SELECT e.*, MAX(e.emp_id) OVER () AS max_emp_id
FROM emp e
) e
WHERE emp_id >= max_emp_id - 200000 AND
modif_date > sysdate - 1 / 24
GROUP BY status, dtls_info;
Условие наmax_emp_id
очень любопытно. Но для этой версии начните с индекса на emp(emp_id, modif_date)
. Я склонен согласиться с APC, что условия на emp_id
, вероятно, не являются необходимыми, и это решение, вероятно, то, что вам действительно нужно.