当前位置: 首页 > 编程日记 > 正文

min聚合函数查询带有额外字段sql|dense_rank()over(partition)|+班级学生成绩最高

oracle爱好者和群snowg的问题

上面的这个,有站点stationid,year,month,day和每天记录的day_tmin字段。
现在要求统计处每个stationid下面每月每日的最小day_tmin字段,因为不关注year,所以sql这样写

select   stationid,  month,day,min(day_tmin)  tmin
from history.history_day_tem_new  
group by stationid month,day

然后要求在上述结果行增加年,需要知道是那一年的这个月日的最低温度.

select aa.stationid,aa.year,aa.month,aa.day,bb.tmin from
(select   stationid,yearmonth,day,day_tmin
from history.history_day_tem_new )aa,(select   stationid,  month,day,min(day_tmin)  tmin
from history.history_day_tem_new  
group by stationid month,day ) bb
where aa.stationid=bb.stationidand aa.month=bb.monthand aa.day=bb.dayand aa.day_tmin=bb.tminorder by  aa.stationid,aa.year,aa.month,aa.day

我aa表统计出所有的带有year的,然后和下面的min分组统计的进行表连接。
可是感觉复杂了,这是查询的结果。
求另外的写法,主要是这个写法感觉不靠谱,如果每天的统计有min(day_tmin)  有重复的最小就肯定不对了。

更新:我本来是使用partition

select distinct stationid, yearmin(day_tmin) over(partition by station order by month,day ) tmin
from history.history_day_tem_new order by stationid

经过仔细群里的辰影sql侠,他使用partition,首先建表(这个方法很好,下次不要create table了)

with w1 as(select '1' id,'2012' year,'12' month,'1' day,to_number('-10','999') tmin from dualunion allselect '1' id,'2012' year,'11' month,'1' day,to_number('-11','999') tmin from dualunion allselect '1' id,'2012' year,'10' month,'1' day,to_number('-12','999') tmin from dualunion allselect '1' id,'2012' year,'12' month,'1' day,to_number('-13','999') tmin from dualunion allselect '1' id,'2012' year,'11' month,'1' day,to_number('-6','999') tmin from dualunion allselect '1' id,'2012' year,'10' month,'1' day,to_number('-6','999') tmin from dualunion allselect '2' id,'2012' year,'12' month,'1' day,to_number('-4','999') tmin from dualunion allselect '2' id,'2011' year,'12' month,'1' day,to_number('-4','999') tmin from dualunion allselect '1' id,'2011' year,'12' month,'1' day,to_number('-20','999') tmin from dual)
select *  from   w1  order by id,month,day,tmin

之后的sql

重要总结:可以看出partition by的字段是需要统计分析(温度)的影响字段,id,month,day(因为对年不敏感,因此不增加),后面的order by(默认升序)字段是实际统计的的

partition by的字段为主语,或者说要分析的对象,然后order by是分析对象的熟悉(最大最小)

 select id,year,month,day,tminfrom (select w1.*,dense_rank()over(partition by id,month,day order by tmin) rn from w1)where rn=1

再比如下面的sql:求各个公司最新月完成凭证情况表,order by 是最新月 year period,partition是unitname

select *from (select UNITCODE,unitname,year,period,num1,row_number() over(partition by UNITNAME order by YEAR desc,period desc) mmfrom (select BD_CORP.UNITCODE,bd_corp.unitname,gl_voucher.year,gl_voucher.period,count(*) num1from gl_voucher, bd_corpwhere bd_corp.pk_corp = gl_voucher.pk_corpand gl_voucher.dr='0'group by BD_CORP.UNITCODE,bd_corp.unitname,gl_voucher.year,gl_voucher.period))

where mm = 1ORDER BY UNITCODE;

再比如下面的这个sql:求出每个病人诊断好id最小下的疾病类别

select patiend_id,diagnosis_type,min(diagnosis_no)over(partition by patiend_id,diagnosis_type) diagnosis_no, diagnosis_class from (Select patient_id, visit_id, diagnosis_class from diagnostic_category a,DIAGNOSIS_DICT b
where a.diagnosis= b.diagnosis(+)
and diagnosis_class is not null and diagnosis_type='3'
)

这里因为min(diagnosis_no),因此其后面的partition后面就不需要order by了

rank()应该也是对的

ROW_NUMBER() 会去掉重复一行

用min partition 不行
select distinct id,year,month,day,tmin,min(tmin)over(partition by id,month,day order by tmin)   from w1        order by id,month,day,tmin

扩展一

2012-12-14 更新

按班级 查出 年龄最大的学生信息
学生表如下

 select * from (select xx.*,rank()over(partition by bj order by age desc) rn from xx) where rn=1
select s_no, name, age, bjfrom xx, (select bj || max(age) a from xx group by bj) yy--甲15 乙18where bj || age = a

平均工资的最大值(附加上ename):

select * from

( select ename,avgs,dense_rank()over( order by avgs desc)rn from

( select ename, avg(sal) avgs from emp group by ename))

where rn=1

扩展二

引用 Oracle:Rank,Dense_Rank,Row_Number比较

Oracle:Rank,Dense_Rank,Row_Number比较

一个员工信息表

Create Table EmployeeInfo (CODE Number(3) Not Null,EmployeeName varchar2(15),DepartmentID Number(3),Salary NUMBER(7,2),

Constraint PK_EmployeeInfo Primary Key (CODE));

Select * From EMPLOYEEINFO

现执行SQL语句:

Select EMPLOYEENAME,SALARY,

RANK() OVER (Order By SALARY Desc)  "RANK",

DENSE_RANK() OVER (Order By SALARY Desc ) "DENSE_RANK",

ROW_NUMBER() OVER(Order By SALARY Desc) "ROW_NUMBER"

From EMPLOYEEINFO

结果如下:

Rank,Dense_rank,Row_number函数为每条记录产生一个从1开始至N的自然数,N的值可能小于等于记录的总数。这3个函数的唯一区别在于当碰到相同数据时的排名策略。

①ROW_NUMBER:

Row_number函数返回一个唯一的值,当碰到相同数据时,排名按照记录集中记录的顺序依次递增。

②DENSE_RANK:

Dense_rank函数返回一个唯一的值,除非当碰到相同数据时,此时所有相同数据的排名都是一样的。

③RANK:

Rank函数返回一个唯一的值,除非遇到相同的数据时,此时所有相同数据的排名是一样的,同时会在最后一条相同记录和下一条不同记录的排名之间空出排名。

同时也可以分组排序,也就是在Over从句内加入Partition by groupField:

Select DEPARTMENTID,EMPLOYEENAME,SALARY,

RANK() OVER ( Partition By DEPARTMENTID Order By SALARY Desc)  "RANK",

DENSE_RANK() OVER ( Partition By DEPARTMENTID Order By SALARY Desc ) "DENSE_RANK",

ROW_NUMBER() OVER( Partition By DEPARTMENTID Order By SALARY Desc) "ROW_NUMBER"

From EMPLOYEEINFO

结果如下:

现在如果插入一条工资为空的记录,那么执行上述语句,结果如下:

会发现空值的竟然排在了第一位,这显然不是想要的结果。解决的办法是在Over从句Order By后加上 NULLS Last即:

Select EMPLOYEENAME,SALARY,

RANK() OVER (Order By SALARY Desc  Nulls Last)  "RANK",

DENSE_RANK() OVER (Order By SALARY Desc Nulls Last) "DENSE_RANK",

ROW_NUMBER() OVER(Order By SALARY Desc Nulls Last ) "ROW_NUMBER"

From EMPLOYEEINFO

结果如下:

相关文章:

提升jmeter自身性能

JMeter负载测试时使用GUI界面和较多的收集测试结果的监听器容易造成jmeter的性能瓶颈,远程测试时的控制台尤为明显。提升JMeter负载测试时性能的方法如下: 官方的解决办法:http://jakarta.apache.org/jmeter/usermanual/best-practices.html#…

C++ STL的reserve函数

在阅读ceph源码过程中发现部分C语法还是不够熟悉,特此做一下笔记。 关于STL中的reserve函数的使用 reserve()是为容器预留空间,即为当前容器设定一个空间分配的阈值,但是并不会为容器直接allocate具体的空间,具体空间的分配是在创…

AJAX进行分页

新建数据集&#xff1a;PagingDataSet.xsd SELECT * from ( select id, areaID, area, father,Row_Number() over (order by areaID) rownum FROM dbo.area) t where t.rownum >startRowIndex and t.rownum <endRowIndex在集合中添加两个参数&#xff1a; startRowIndex…

华为服务器引入清空外部配置文件,云服务器还原配置文件

云服务器还原配置文件 内容精选换一换外部镜像文件在从原平台导出前&#xff0c;没有按照“Windows操作系统的镜像文件限制”的要求完成初始化操作&#xff0c;推荐您使用弹性云服务器完成相关配置。流程如图1所示。云服务器的正常运行依赖于XEN Guest OS driver(PV driver)和K…

脚本SFTP定时取Linux服务器文件

为什么80%的码农都做不了架构师&#xff1f;>>> 在工作中尤其是政府机关为了安全方面考虑&#xff0c;通常是不开通服务器与服务器之间FTP服务 如果每天又要巡检服务器&#xff0c;每次都要登录查看某个文件给自己的工作带来很大的不便 这里通过 winscp工具使用S…

使用sigaction处理内核信号

文章目录函数描述函数使用抓取发送信号的进程信息mark一次获取内核信号&#xff0c;并作相应处理的手段linux内核中断机制的一个重要实现就是信号。信号使得内核和用户态的交互更加便捷&#xff0c;这个便捷对开发者来说可以更好的利用系统原生内核来处理信息。《深入理解unix内…

ios share extension 真机不显示_ios企业签名:APPGroups实现App之间数据共享

一、认识App GroupsAppGroup allows data sharing between two different apps or even app and widgets by creating one common shared path (like document directory). Data saved over there can be accessed by any app which is associated with that particular AppGro…

处理 JSON null 和空数组及对象

描述了对 JSON 数据中使用的 null 和空数组及对象的处理。 JSON 数据具有 null 和空数组及对象的概念。此部分说明其中每个概念如何映射到 null 和未设置的数据对象概念。 Null 值 JSON 具有特殊值 null&#xff0c;可以对任何数据类型设置该值&#xff0c;包括数组、对象、数字…

xml file too big to import to wordpress website

xml文件太大无法上传到wordpress 原因&#xff1a;从一个wordpress上导出了自己所有的文章&#xff0c;大概6~7MB&#xff0c;准备导入到本机自建的一个wordpress&#xff0c;不过上传文件有限制&#xff0c;最大2MB。 解决方法&#xff1a; 1. 网上很多关于修改配置文件的…

亚麻 面经_ml

Ds -如何预测一个人会不会在下一个月在Amazon买东西&#xff0c;有什么模型。https://mlwave.com/predicting-repeat-buyers-vowpal-wabbit/https://www.researchgate.net/post/How_can_I_study_the_past_spending_behaviour_of_a_customer_in_a_banking_perspective_and_predi…

ceph bluestore源码分析:C++ 获取线程id

阅读ceph源码过程中需要明确当前操作是由哪个线程发出&#xff0c;此时需要根据线程id来确认线程名称 C获取线程id是通过系统调用来直接获取 函数描述 头文件:<sys/syscall.h> 函数名称:syscall(SYS_gettid) 该函数直接返回了一个pid_t int类型的数字&#xff0c;即为当…

判断两直线段是否相交

转自&#xff1a;http://www.cnblogs.com/shengshouzhaixing/archive/2013/03/17/2964950.html //功能&#xff1a;求点在有向直线左边还是右边 //返回&#xff1a;0共线、1左边、-1右边 int left_right(point a,point b,double x,double y) { d…

led显示屏建设标准_户外LED显示屏3大防护标准_显示屏应对恶劣天气?

户外LED显示屏是现在LED显示屏应用最棺广泛的领域。面积巨大&#xff0c;显示效果震撼。同时为了更好的宣传效果&#xff0c;通常安装余楼顶&#xff0c;道路等空旷无遮挡地带。由于面积大且处于露天状态&#xff0c;LED显示屏面临巨大的环境挑战。经常要面对大风、暴雨、冰雹等…

转载 Sqlerver 计算 MD5

2019独角兽企业重金招聘Python工程师标准>>> 在SQl2005下自带的函数hashbytes() &#xff0c;此函数是微软在SQL SERVER 2005中提供的&#xff0c;可以用来计算一个字符串的 MD5 和 SHA1 值&#xff0c;使用方法如下&#xff1a; --获取123456的MD5加密串 select ha…

vim使用说明

模式 命令 操作 开始 vim 文件路径 打开|新建文件 命令模式 i 切换到输入模式 x 删除当前光标所在处的字符 : 切换到底线命令模式 shiftzz 保存并退出 移动光标的方法 h|← 左 j|↓ 下 k|↑ 上 l|→ 右 [Ctrl] [f] 输入模式下的page down [Ctrl] […

g++编译c++11特性 的.cc文件

写一个.cc文件&#xff0c;其中抱哈std::lock_guard以及std::thread等c11特性&#xff0c;开始使用gcc编译,过程中出现如下问题 gcc test_lock.cc -o test_lock This file requires compiler and library support for the ISO C 2011 standard. This support is currently ex…

联想r720内存频率_联想 IdeaPad14s 2020 轻薄本双十一促销

IT之家11月10日消息 作为一款主打轻薄的笔记本电脑&#xff0c;联想 IdeaPad14s 2020 自推出以来便受到不少办公学习用户的青睐。如今&#xff0c;这款联想 IdeaPad14s 2020 轻薄笔记本已开启双十一促销&#xff0c;搭载第十代酷睿处理器&#xff0c;采用 14 英寸双侧窄边框屏幕…

HDU 1273 漫步森林

比赛的时候是看见人家A得很快&#xff0c;但是一看的时候觉得没什么头绪&#xff0c;画了一个六边形的灵感来了&#xff0c;就YY一下 第一次提交写错了结束条件&#xff0c;之后意淫下公式交上去A了。 用五边形来解释&#xff1a; 1.设有五个点1&#xff0c;2,3,4,5, 2.从1开始…

在请求完成后回调delegate的方法。然而回调时经常遇到这种情况:delegate已经被释放...

最近的项目遇到了网络请求&#xff0c;需要在请求完成后回调delegate的方法。然而回调时经常遇到这种情况&#xff1a;delegate已经被释放&#xff0c;这时调用其方法则会引起crash。 objc的runtime中有两种判断类型的方式比较靠谱&#xff0c;他们可以直接取得任意一个objc_ob…

C++ 学习笔记之——文件操作和文件流

1. 文件的概念 对于用户来说&#xff0c;常用到的文件有两大类&#xff1a;程序文件和数据文件。而根据文件中数据的组织方式&#xff0c;则可以将文件分为 ASCII 文件和二进制文件。 ASCII 文件&#xff0c;又称字符文件或者文本文件&#xff0c;它的每一个字节放一个 ASCII 代…

利用blktrace分析磁盘I/O

原文&#xff1a;https://blog.csdn.net/ygtlovezf/article/details/80528300 blktrace对于分析block I/O是个非常好的工具&#xff0c;本篇文章记录了如何使用blktrace。 blktrace原理 blktrace是对通用块层&#xff08;block layer&#xff09;的I/O跟踪机制&#xff0c;它…

shiro 同时实现url和按钮的拦截_一个“保存”按钮同时存在“增删改”三种操作,该如何去实现?...

一般情况下&#xff0c;对表格中的数据进行“增删改”操作&#xff0c;都是直接操作数据库。现在有些项目因为设计或者优化的缘故&#xff0c;不对表格中的数据进行“增删改”&#xff0c;而是通过最后“保存”按钮的操作&#xff0c;一次性将数据传至服务器&#xff0c;由服务…

在网络通讯中,如何自己分配可用的端口号和获取自己的ip地址

在编写一些程序时&#xff0c;为了程序可以在其他电脑上也可以使用&#xff0c;而不用手动去更改ip,或者碰到端口不可用的情况。在这里找到了一个好的方法&#xff0c;实际使用也没有问题&#xff01;故此推荐给大家! 方案&#xff1a; 在构建网络时&#xff0c;使用&#xff1…

【翻译】ASP.NET WEB API异常处理

当一个web api抛出一个异常后 此异常会被转化成一个HTTP响应 错误代码为500的服务错误 但是如果你不想让客户端看到500的错误码 你也可以自定义错误码 如下代码当用户输入的ID没有与之相关的数据 则返回了错误码为404的错误 &#xff08;页面未找到&#xff09; public Product…

hook NtTerminateProcess进行应用的保护

这段时间在学习驱动&#xff0c;然后看到hook ssdt的代码&#xff0c;找了一个写的清晰的学习了一下&#xff1a;http://www.netfairy.net/?post218 这里是hook NtOpenProcess&#xff0c;但是想自己练手所以hook NtTerminateProcess&#xff0c;经过多次蓝屏后&#xff0c;然…

linux系统 长久记录所有用户所有操作记录

在linux系统中想要记录所有登录过当前系统的用户操作&#xff0c;排查有人对当前系统做的何种操作导致系统问题&#xff0c;可以按照如下方法进行。 前言 在描述操作步骤之前&#xff0c;先说一下系统环境变量的相关配置文件 ~/.bashrc和~/.bash_file&#xff0c;这两个文件…

jquery图片播放切换插件

点击这里查看效果可自定义数字样式和左右点击按钮这个更好&#xff1a;移入按钮切换版本更多图片轮播以下是HTML文件代码&#xff1a; 1 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transiti…

安卓饼状图设置软件_话单及银行卡交易智能分析软件

一、产品概况&#xff1a; 思迈奥SMILE数据智能分析软件是由我司自主设计与研发的一款结合在公安和检察院的侦查业务经验而定制研发的数据智能分析系统&#xff0c;包含于话单、电子银行账单、及其它数据(个人出行数据、社会资源数据、微信数据及其它聊天数据)等的数据导入、检…

跨区域MPLS TE

拓扑&#xff1a; R1配置&#xff1a; mpls label range 100 199 mpls traffic-eng tunnels interface Loopback0 ip address 192.168.1.1 255.255.255.255 ! interface Tunnel1 ip unnumbered Loopback0 tunnel mode mpls traffic-eng tunnel destination 192.168.1.4 tunnel …

C++智能指针: shared_ptr 实现详解

文章目录shared_ptr描述声明作用原理实现函数使用关于shared_ptr循环引用问题shared_ptr描述 声明 shared_ptr属于C11特性中新加的一种智能指针&#xff0c;它的实现方式是模版类&#xff0c;头文件<memory> template <class T> class shared_ptr 所以使用shared…