我有一个查询,显示由代理商发布的按日期传递的通行证。我想获得在这里颁发通行证最多的前20家代理商
SELECT
eofficeuat.gatepass.agent_id,
eofficeuat.cnf_agents.agent_name,
to_char(eofficeuat.gatepass.issuedatetime, 'dd-mm-yyyy HH12:MI:SS PM') AS
issueddatetime,
eofficeuat.gatepass.id AS passnumber,
eofficeuat.gatepass.vehicletype,
eofficeuat.cardprintlog_user.cardnumber
FROM
eofficeuat.gatepass
INNER JOIN eofficeuat.cnf_agents ON eofficeuat.gatepass.agent_id = eofficeuat.cnf_agents.agent_id
INNER JOIN eofficeuat.cardprintlog_user ON eofficeuat.gatepass.agent_id = eofficeuat.cardprintlog_user.agent_id
WHERE
eofficeuat.gatepass.issuedatetime between TO_DATE ('2019/09/28', 'yyyy/mm/dd') and TO_DATE ('2019/09/29', 'yyyy/mm/dd')
ORDER BY
eofficeuat.gatepass.issuedatetime
您的数据ID中没有任何内容标识“代理商”。如果我假设您的意思是“代理”,则可以通过汇总然后限制结果来获得前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
子句。
此外,我建议您从不在Oracle中的日期使用BETWEEN
。有一个时间组件可能会导致问题。
如果您只打算在'2019-09-28'时间,那么:
gp.issuedatetime >= DATE '2019-09-28' AND
gp.issuedatetime < DATE '2019-09-29'
如果您打算both 28日和29日:
gp.issuedatetime >= DATE '2019-09-28' AND
gp.issuedatetime < DATE '2019-09-30'
您可以对前20条记录使用LIMIT
子句(12c或更高版本),如下所示:
SELECT eofficeuat.gatepass.agent_id, eofficeuat.cnf_agents.agent_name, COUNT(1) as cnt
FROM eofficeuat.gatepass INNER JOIN
eofficeuat.cnf_agents
ON eofficeuat.gatepass.agent_id = eofficeuat.cnf_agents.agent_id INNER JOIN
eofficeuat.cardprintlog_user
ON eofficeuat.gatepass.agent_id = eofficeuat.cardprintlog_user.agent_id
WHERE eofficeuat.gatepass.issuedatetime BETWEN DATE '2019-09-28' AND DATE '2019-09-29'
GROUP BY eofficeuat.gatepass.agent_id, eofficeuat.cnf_agents.agent_name
ORDER BY cnt DESC
FETCH FIRST 20 ROWS ONLY; -- this will fetch top 20 agents
干杯!