Oracle查询以获得20个具有发行通行证的顶级代理商

问题描述 投票:0回答:2

我有一个查询,显示由代理商发布的按日期传递的通行证。我想获得在这里颁发通行证最多的前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
sql oracle top-n
2个回答
0
投票

您的数据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;

显然,如果您的意思是“机构”并且由不同的列标识,则只需调整SELECTGROUP 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'

0
投票

您可以对前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

干杯!

© www.soinside.com 2019 - 2024. All rights reserved.