Ничто в ваших данных не идентифицирует "агентство". Если я предполагаю, что вы имеете в виду «агент», вы можете получить 20 лучших, агрегируя и затем ограничивая результат. В Oracle 12C + вы можете использовать:
SELECT gp.agent_id, a.agent_name, COUNT(*)
FROM eofficeuat.gatepass gp INNER JOIN
eofficeuat.cnf_agents a
ON gp.agent_id = a.agent_id INNER JOIN
eofficeuat.cardprintlog_user u
ON gp.agent_id = u.agent_id
WHERE gp.issuedatetime BETWEN DATE '2019-09-28' AND DATE '2019-09-29'
GROUP BY gp.agent_id, a.agent_name
ORDER BY COUNT(*) DESC
FETCH FIRST 1 ROW ONLY;
В более ранних версиях необходим подзапрос:
SELECT *
FROM (SELECT gp.agent_id, a.agent_name, COUNT(*)
FROM eofficeuat.gatepass gp INNER JOIN
eofficeuat.cnf_agents a
ON gp.agent_id = a.agent_id INNER JOIN
eofficeuat.cardprintlog_user u
ON gp.agent_id = u.agent_id
WHERE gp.issuedatetime BETWEEN DATE '2019-09-28' AND DATE '2019-09-29'
GROUP BY gp.agent_id, a.agent_name
ORDER BY COUNT(*) DESC
) a
WHERE rownum <= 20;
Очевидно, если вы имеете в виду «агентство», и это определяется различнымистолбцы, вы просто изменили бы предложения SELECT
и GROUP BY
.
Кроме того, я бы посоветовал вам никогда использовать BETWEEN
для дат в Oracle. Существует компонент времени, который может вызывать проблемы.
Если вы намерены использовать только 2019-09-28, тогда:
gp.issuedatetime >= DATE '2019-09-28' AND
gp.issuedatetime < DATE '2019-09-29'
Если вы намереваетесь оба 28 и 29:
gp.issuedatetime >= DATE '2019-09-28' AND
gp.issuedatetime < DATE '2019-09-30'