sql - oracle查询get 20个已通过的顶级代理
问题描述
我有一个查询,显示机构签发的按日期通行证。我想在这里获得最多通行证的前 20 家机构是我的查询
解决方案
您的数据 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
andGROUP 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'
推荐阅读
- python - 将方法添加到内置函数
- xml - 如何在销售订单搜索菜单中删除默认过滤器并添加新过滤器(查看名称:sale.order.search.inherit.sale)
- listview - Flutter 将 FutureBuilder 小部件放在一个 Column 中
- c# - 不能将属性或索引器“ShapeRange.Parts”分配给——它是只读的
- reactjs - React Native 动画图像旋转播放和暂停
- dyld - dyld:惰性符号绑定失败:找不到符号:___emutls_get_address
- ruby-on-rails - 无法自动加载常量 POST,需要 /example/app/models/post.rb 来定义它
- python - Python chr() 函数返回错误字符
- amazon-web-services - 赋予用户在 cognito 中重置过期临时密码的能力
- groovy - Groovy xmlparser 获取属性值