摘要:
个人感觉这个没什么用,对数据加载后的一些数据筛选最好结合Linq一起使用还有点价值!select ename,sal,ntile(3) over(order by sal desc nulls last) tile from emp上面的意思是把记录分成3份如果是14条则分成554三份!但是最大的问题是where 条件里不能直接筛选某一份的记录! 阅读全文
摘要:
如果要查询emp表工资最高和最低的员工姓名(排除工资为null)按以前的想法一条简单的语句似乎不好实现最常见的是先升序取最小,再降序取最大有了First/Last排名后就不一样了select min(ename) keep(dense_rank first order by sal desc nulls last) first, min(ename) keep(dense_rank last order by sal desc nulls first) lastfrom emp这里需要注意的是min改成max对查询结果是没有任何影响的,如果要改成sum或avg则必须保证括号里面的列是数值类型 阅读全文
摘要:
直接上代码:select ename, sal, row_number() over(order by sal desc nulls last) row_number, rank() over(order by sal desc nulls last) rank, dense_rank() over(order by sal desc nulls last) dense_rankfrom emp where rownum<=10结果: 总结:①ROW_NUMBER: Row_number函数返回一个唯一的值,当碰到相同数据时,排名按照记录集中记录的顺序依次递增。 ②DENSE_RANK: 阅读全文
摘要:
假如我要查询scott下emp表这样格式的结果包含三列:雇员名 工资 部门平均工资以前的做法也许会这么做:代码SELECT E.ENAME,E.SAL,AV.AVGSALFROM EMP E, (SELECT DEPTNO EMP_DEPT,AVG(SAL) AVGSAL FROM EMP GROUP BY DEPTNO) AVWHERE E.DEPTNO=AV.EMP_DEPT但有了分析函数以后就可以简化一下:代码SELECT ENAME,SAL,AVG(SAL) OVER(PARTITION BY DEPTNO) FROM EMP第一种方式的执行计划是:第二种方式 分析函数的执行计划是: 阅读全文