row_number() over()用例及相近函数rank()和dense_rank()的介绍

今天在群里跟一群同学聊天,恍然发现有个同学正在朝dba的方向发展,正好脑子里有个以前的问题想要问一下,问题是:row_number() over()使用partition by的时候,后面条件约束使用什么关键词会导致前面的partition by失效。结果同学会order by,但是木有接触过partition by。。。
早饭都忘了吃了。。
这是个问题啊,虽然那次开发的时候写的语句出现的现象不一定具有典型意义,但是我觉得这个函数用起来很舒服,有很多让我个人很满意的功能,以后要用就不能不弄明白这些问题。同学不能解决,那就顺手在网上找一下看有没有相关的文档能参考一下了。
百度,搜索,关键词 “row_number partition by什么情况下会失效”,查询结果发现,没有针对这个问题的,但是前两项竟然是对row_number over partiton by 做的不错的解释,另外顺带介绍了另外两个具有相同功能但是不同分组排序结果的方法,顿时觉得值得了。现在把这些解释都放上来以做备用。
<
row_number()和rownum差不多,功能更强一点(可以在各个分组内从1开时排序).
rank()是跳跃排序,有两个第二名时接下来就是第四名(同样是在各个分组内).
dense_rank()l是连续排序,有两个第二名时仍然跟着第三名。相比之下row_number是没有重复值的
>
row_number() OVER (PARTITION BY COL1 ORDER BY COL2) 表示根据COL1分组,在分组内部根据 COL2排序,而此函数计算的值就表示每组内部排序后的顺序编号(组内连续的唯一的)
SQL> SELECT G.*, ROW_NUMBER() OVER(PARTITION BY a ,b ORDER BY c DESC) ROWN
2 from (select ‘1’ a, ‘2’ b, ‘1’ c
3 from dual
4 union all
5 select ‘1’, ‘2’, ‘2’
6 from dual
7 union all
8 select ‘1’, ‘3’, ‘3’
9 from dual
10 union all
11 select ‘1’, ‘3’, ‘4’
12 from dual
13 union all
14 select ‘1’, ‘4’, ‘5’ from dual
15 union all
16 select ‘1’,’3′,’5’from dual) G
17 ;
A B C ROWN
– – – ———-
1 2 2 1
1 2 1 2
1 3 5 1
1 3 4 2
1 3 3 3
1 4 5 1
6 rows selected
与rownum的区别在于:使用rownum进行排序的时候是先对结果集加入伪列rownum然后再进行排序,而此函数在包含排序从句后是先排序再计算行号码.
row_number()和rownum差不多,功能更强一点(可以在各个分组内从1开时排序).
rank()是跳跃排序,有两个第二名时接下来就是第四名(同样是在各个分组内).
dense_rank()l是连续排序,有两个第二名时仍然跟着第三名。相比之下row_number是没有重复值的 .
lag(arg1,arg2,arg3):
arg1是从其他行返回的表达式
arg2是希望检索的当前行分区的偏移量。是一个正的偏移量,时一个往回检索以前的行的数目。
arg3是在arg2表示的数目超出了分组的范围时返回的值。
语句一:
select row_number() over(order by sale/cnt desc) as sort, sale/cnt
from (
select -60 as sale,3 as cnt from dual union
select 24 as sale,6 as cnt from dual union
select 50 as sale,5 as cnt from dual union
select -20 as sale,2 as cnt from dual union
select 40 as sale,8 as cnt from dual);
执行结果:
SORT SALE/CNT
———- ———-
1 10
2 5
3 4
4 -10
5 -20
语句二:查询员工的工资,按部门排序
select ename,sal,row_number() over (partition by deptno order by sal desc) as sal_order from scott.emp;
执行结果:
ENAME SAL SAL_ORDER
——————– ———- ———-
KING 5000 1
CLARK 2450 2
MILLER 1300 3
SCOTT 3000 1
FORD 3000 2
JONES 2975 3
ADAMS 1100 4
SMITH 800 5
BLAKE 2850 1
ALLEN 1600 2
TURNER 1500 3
WARD 1250 4
MARTIN 1250 5
JAMES 950 6
已选择14行。
语句三:查询每个部门的最高工资
select deptno,ename,sal from
(select deptno,ename,sal,row_number() over (partition by deptno order by sal desc) as sal_order
from scott.emp) where sal_order <2;
执行结果:
DEPTNO ENAME SAL
———- ——————– ———-
10 KING 5000
20 SCOTT 3000
30 BLAKE 2850
已选择3行。
语句四:
select deptno,sal,rank() over (partition by deptno order by sal) as rank_order from scott.emp order by deptno;
执行结果:
DEPTNO SAL RANK_ORDER
———- ———- ———-
10 1300 1
10 2450 2
10 5000 3
20 800 1
20 1100 2
20 2975 3
20 3000 4
20 3000 4
30 950 1
30 1250 2
30 1250 2
30 1500 4
30 1600 5
30 2850 6
已选择14行。
语句五:
select deptno,sal,dense_rank() over(partition by deptno order by sal) as dense_rank_order from scott.emp order by deptn;
执行结果:
DEPTNO SAL DENSE_RANK_ORDER
———- ———- —————-
10 1300 1
10 2450 2
10 5000 3
20 800 1
20 1100 2
20 2975 3
20 3000 4
20 3000 4
30 950 1
30 1250 2
30 1250 2
30 1500 3
30 1600 4
30 2850 5
已选择14行。
语句六:
select deptno,ename,sal,lag(ename,1,null) over(partition by deptno order by ename) as lag_ from scott.emp order by deptno;
执行结果:
DEPTNO ENAME SAL LAG_
———- ——————– ———- ——————–
10 CLARK 2450
10 KING 5000 CLARK
10 MILLER 1300 KING
20 ADAMS 1100
20 FORD 3000 ADAMS
20 JONES 2975 FORD
20 SCOTT 3000 JONES
20 SMITH 800 SCOTT
30 ALLEN 1600
30 BLAKE 2850 ALLEN
30 JAMES 950 BLAKE
30 MARTIN 1250 JAMES
30 TURNER 1500 MARTIN
30 WARD 1250 TURNER
以上用例和详细介绍来自《https://www.blogjava.net/kxbin/articles/360195.html》

打算

又有段时间没有写自己的博客了,最近一段时间总是忙的天昏地暗,加班加到要吐。连春节放假回家都不怎么想开电脑。
我发现,让一个人讨厌他自己自以为喜欢的事物比较不错的方法,就是让这件事变成他的工作。当一件自以为有意思的事情变成了枯燥乏味而又不得不不停重复的工作的时候,我嘞个去  多么难以忍受!
刚来公司的时候我就跟面试我的人说过,适当的加班可以接受。啥工作还没有个紧急情况,偶尔工作量大的时候呢对吧,咱可以理解。然而这种毫无节制的加班,并且习以为常,就难以接受了。加班加到几乎没有了自己的正常生活,每天每天都是工作,那么工作的意义就不再存在,还工作下去有设么么意思呢。
我从来认为,工作是为了生活。当工作把生活的时间破坏甚至完全占据,那么这份工作就是十分不值得的。所以我决定离开。
一直有些犹豫自己到底想要进入什么样的公司。就我本身而言,我想进入一个比较追寻潮流,做互联网弄潮儿的企业,因为这样的企业里可以较多的接触到最新的概念,最新的技术,这对我比较有好处,同时这样的企业也有益于我以后创业的打算。毕竟更新的东西,才更容易是第一个吃螃蟹的人,也许会更容易掘金。
同时也有些倾向于做一些固定业务的公司,这样在这个行业中精通后,可以比较稳定。
另外我还想去澳洲,基于某些原因。所以这一切都还在思考中。

老旧的草稿,今儿才发现。还是发了吧

OK,在家呆着无聊,搬家虽然还没弄完,但是一时半会有点不大想动,不如在家折腾一下新申请的域名。
域名早就申请好了,但是被锁定,因为没有做境外网站的申请审核。上传扫描件之后没几天,现在已经解锁。上万网上设置了域名解析。然后就打算在自己的网站空间上再做一个,然后重定向到现在的这个域名。但是,很奇怪的是,我并没有把新的域名对应的程序弄好,然后访问www前缀的域名,就被解析到一个我不知道的网站,看样子是原来别人放的广告网站。可是我已经重新进行域名解析了啊,奇怪。
输入不带www前缀的网站,返回一个404错误,两个都不好理解到底怎么回事。需要问一下万网的客服了。
本来想把自己原来的网站程序也放到一个重新建立的文件夹里,这样分辨起来比较方便,也易于管理(其实主要是怕重建网站把原来数据搞没了,麻烦)。做倒是不麻烦,可是把重定向文件做好,文件移动好之后,网站是能访问了,CSS样式却没能加载上,进入网站看到的只能是黑白的空空的几乎没有任何美化的页面,丑死了。貌似是某些文件里加载cSS文件的路径使用了绝对路径,找了半天没有找到。一怒之下,把原来网站的头文件重命名,然后整个又放回原来跟路径,另外做了一个同名的头文件用作重定向文件。尝试后,OK,原来的网站又能正确运行了。
好,现在又开始重新
这是几天前写的了,今天忽然发现有自动保存草稿的功能还是十分不错的,我当时还以为写的这些已经丢了。。。  哈哈
问题已经解决了。购买的空间可以映射多个域名,但是需要添加附属域名,不能不添加附属域名就直接访问。这个域名因为可能原来被别人注册过但是没有做自己的网站,而是挂起来打算卖了,所以使用了一些方法,在访问这个域名对应IP没有回应的时候就会显示他们当初的广告页。
这个网站是给别人做的,映射好安装完wordpress,设置好用用户就不管了,给要用的那个人,他自己想要搞成啥样就搞成啥样吧。
兄弟来了,去嗨~