首页 > 解决方案 > oracle查询get 20个已通过的顶级代理

问题描述

我有一个查询,显示机构签发的按日期通行证。我想在这里获得最多通行证的前 20 家机构是我的查询

标签: sqloracletop-n

解决方案


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

显然,如果您的意思是“代理”并且由不同的列标识,您只需调整SELECTandGROUP BY子句。

另外,我建议您永远不要在 Oracle中使用BETWEEN日期。有一个时间组件可能会导致问题。

如果您只打算在“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'

推荐阅读