首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >oracle查询获取已发布通行证的20家顶级机构

oracle查询获取已发布通行证的20家顶级机构
EN

Stack Overflow用户
提问于 2019-10-26 17:49:27
回答 2查看 47关注 0票数 0

我有一个查询,显示由代理商签发的日期通行证。我想得到前20名谁有最多的通行证颁发在这里是我的问题

EN

回答 2

Stack Overflow用户

发布于 2019-10-26 19:41:05

您的数据id中没有标识“代理”的任何内容。如果我假设你指的是"agent",你可以通过聚合然后限制结果来获得前20名。在Oracle 12C+中,可以使用:

代码语言:javascript
运行
复制
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;

在早期版本中,需要一个子查询:

代码语言:javascript
运行
复制
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‘上使用,那么:

代码语言:javascript
运行
复制
gp.issuedatetime >= DATE '2019-09-28' AND
gp.issuedatetime < DATE '2019-09-29'

如果您想同时使用28号和29号:

代码语言:javascript
运行
复制
gp.issuedatetime >= DATE '2019-09-28' AND
gp.issuedatetime < DATE '2019-09-30'
票数 1
EN

Stack Overflow用户

发布于 2019-10-26 22:15:04

您可以对前20条记录使用LIMIT子句(12c或更高版本),如下所示:

代码语言:javascript
运行
复制
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

干杯!!

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58569709

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档