数据库-函数-over,row_number,dense_rank,rank,log,lead,first_value等

OVER(PARTITION BY)函数介绍

开窗函数          
     Oracle从8.1.6开始提供分析函数,分析函数用于计算基于组的某种聚合值,它和聚合函数的不同之处是:对于每个组返回多行,而聚合函数对于每个组只返回一行。

      开窗函数指定了分析函数工作的数据窗口大小,这个数据窗口大小可能会随着行的变化而变化,举例如下:
1:over后的写法:    
   over(order by salary) 按照salary排序进行累计,order by是个默认的开窗函数
   over(partition by deptno)按照部门分区

 

     over(partition by deptno order by salary)

 

2:开窗的窗口范围
over(order by salary range between 5 preceding and 5 following):窗口范围为当前行数据幅度减5加5后的范围内的。

举例:

 

--sum(s)over(order by s range between 2 preceding and 2 following) 表示加2或2的范围内的求和

  select name,class,s, sum(s)over(order by s range between 2 preceding and 2 following) mm from t2
adf               3               45               45   --45加2减2即43到47,但是s在这个范围内只有45
asdf             3               55               55
cfe               2               74               74
3dd               3               78               158 --78在76到80范围内有78,80,求和得158
fda               1               80               158
gds               2               92               92
ffd               1               95               190
dss               1               95               190
ddd               3               99               198

gf         3        99        198

 

 

 

over(order by salary   rows  between 5 preceding and 5 following):窗口范围为当前行前后各移动5行。

举例:

 

--sum(s)over(order by s rows between 2 preceding and 2 following)表示在上下两行之间的范围内
select name,class,s, sum(s)over(order by s rows between 2 preceding and 2 following) mm from t2
adf               3               45               174   (45+55+74=174)
asdf             3               55               252     (45+55+74+78=252)
cfe               2               74               332       (74+55+45+78+80=332)
3dd               3               78               379       (78+74+55+80+92=379)
fda               1               80               419
gds               2               92               440
ffd               1               95               461
dss               1               95               480
ddd               3               99               388
gf                 3               99               293

 

 

over(order by salary  range  between unbounded preceding and unbounded following)或者
over(order by salary  rows  between unbounded preceding and unbounded following):窗口不做限制

 

3、与over函数结合的几个函数介绍

row_number()over()、rank()over()和dense_rank()over()函数的使用

下面以班级成绩表t2来说明其应用

t2表信息如下:
cfe               2               74
dss               1               95
ffd               1               95
fda               1               80
gds               2               92
gf                 3               99
ddd               3               99
adf               3               45
asdf             3               55
3dd               3               78

select * from                                                                                                                                           
       (                                                                                                                                                     
       select name,class,s,rank()over(partition by class order by s desc) mm from t2
       )                                                                                                                                                     
       where mm=1;
得到的结果是:
dss               1               95               1
ffd               1               95               1
gds               2               92               1
gf                 3               99               1
ddd               3               99               1 

注意:
       1.在求第一名成绩的时候,不能用row_number(),因为如果同班有两个并列第一,row_number()只返回一个结果;
select * from                                                                                                                                           
       (                                                                                                                                                     
       select name,class,s,row_number()over(partition by class order by s desc) mm from t2
       )                                                                                                                                                     
       where mm=1;
             95               1   --95有两名但是只显示一个
             92               1
             99               1 --99有两名但也只显示一个

       2.rank()和dense_rank()可以将所有的都查找出来:
如上可以看到采用rank可以将并列第一名的都查找出来;
         rank()和dense_rank()区别:
         --rank()是跳跃排序,有两个第二名时接下来就是第四名;
select name,class,s,rank()over(partition by class order by s desc) mm from t2
dss               1               95               1
ffd               1               95               1
fda               1               80               3 --直接就跳到了第三
gds               2               92               1
cfe               2               74               2
gf                 3               99               1
ddd               3               99               1
3dd               3               78               3
asdf             3               55               4
adf               3               45               5
         --dense_rank()l是连续排序,有两个第二名时仍然跟着第三名
select name,class,s,dense_rank()over(partition by class order by s desc) mm from t2
dss               1               95               1
ffd               1               95               1
fda               1               80               2 --连续排序(仍为2)
gds               2               92               1
cfe               2               74               2
gf                 3               99               1
ddd               3               99               1
3dd               3               78               2
asdf             3               55               3
adf               3               45               4

--sum()over()的使用
select name,class,s, sum(s)over(partition by class order by s desc) mm from t2 --根据班级进行分数求和
dss               1               95               190   --由于两个95都是第一名,所以累加时是两个第一名的相加
ffd               1               95               190 
fda               1               80               270   --第一名加上第二名的
gds               2               92               92
cfe               2               74               166
gf                 3               99               198
ddd               3               99               198
3dd               3               78               276
asdf             3               55               331
adf               3               45               376

first_value() over()和last_value() over()的使用  



--找出这三条电路每条电路的第一条记录类型和最后一条记录类型

SELECT opr_id,res_type,
       first_value(res_type) over(PARTITION BY opr_id ORDER BY res_type) low,
       last_value(res_type) over(PARTITION BY opr_id ORDER BY res_type rows BETWEEN unbounded preceding AND unbounded following) high
  FROM rm_circuit_route
WHERE opr_id IN ('000100190000000000021311','000100190000000000021355','000100190000000000021339')
 ORDER BY opr_id;

 

注:rows BETWEEN unbounded preceding AND unbounded following 的使用

--取last_value时不使用rows BETWEEN unbounded preceding AND unbounded following的结果

 

SELECT opr_id,res_type,
       first_value(res_type) over(PARTITION BY opr_id ORDER BY res_type) low,
       last_value(res_type) over(PARTITION BY opr_id ORDER BY res_type) high
  FROM rm_circuit_route
 WHERE opr_id IN ('000100190000000000021311','000100190000000000021355','000100190000000000021339')
 ORDER BY opr_id;

如下图可以看到,如果不使用

rows BETWEEN unbounded preceding AND unbounded following,取出的last_value由于与res_type进行进行排列,因此取出的电路的最后一行记录的类型就不是按照电路的范围提取了,而是以res_type为范围进行提取了。

 

 

 

 

 

在first_value和last_value中ignore nulls的使用
数据如下:

 

 

取出该电路的第一条记录,加上ignore nulls后,如果第一条是判断的那个字段是空的,则默认取下一条,结果如下所示:

 

 

--lag() over()函数用法(取出前n行数据)
lag(expresstion,<offset>,<default>)
with a as 
(select 1 id,'a' name from dual
  union
  select 2 id,'b' name from dual
  union
  select 3 id,'c' name from dual
  union
  select 4 id,'d' name from dual
  union
  select 5 id,'e' name from dual

select id,name, lag(id,1,'')over(order by name) from a;

--lead() over()函数用法(取出后N行数据)

lead(expresstion,<offset>,<default>)
with a as 
(select 1 id,'a' name from dual
 union
 select 2 id,'b' name from dual
 union
 select 3 id,'c' name from dual
 union
 select 4 id,'d' name from dual
 union
 select 5 id,'e' name from dual

select id,name,lead(id,1,'')over(order by name) from a;

--ratio_to_report(a)函数用法 Ratio_to_report() 括号中就是分子,over() 括号中就是分母
with a as (select 1 a from dual
           union all
select 1 a from dual
           union  all
select 1 a from dual
           union all
select 2 a from dual
           union all 
select 3 a from dual
           union all
select 4 a from dual
           union all
select 4 a from dual
           union all
select 5 a from dual
           )
select a, ratio_to_report(a)over(partition by a) b from a 
order by a; 

with a as (select 1 a from dual
           union all
select 1 a from dual
           union  all
select 1 a from dual
           union all
select 2 a from dual
           union all 
select 3 a from dual
           union all
select 4 a from dual
           union all
select 4 a from dual
           union all
select 5 a from dual
           )
select a, ratio_to_report(a)over() b from a --分母缺省就是整个占比
order by a; 

with a as (select 1 a from dual
           union all
select 1 a from dual
           union  all
select 1 a from dual
           union all
select 2 a from dual
           union all 
select 3 a from dual
           union all
select 4 a from dual
           union all
select 4 a from dual
           union all
select 5 a from dual
           )
select a, ratio_to_report(a)over() b from a
group by a order by a;--分组后的占比


文章来自:http://blog.youkuaiyun.com/631799/article/details/7419797

### 回答1: 1. SELECT 2. FROM 3. WHERE 4. GROUP BY 5. ORDER BY 6. JOIN 7. LEFT JOIN 8. RIGHT JOIN 9. FULL OUTER JOIN 10. INNER JOIN 11. UNION 12. UNION ALL 13. HAVING 14. COUNT 15. SUM 16. AVG 17. MAX 18. MIN 19. DISTINCT 20. PARTITION BY 21. OVER 22. ROW_NUMBER 23. RANK 24. DENSE_RANK 25. LAG 26. LEAD 27. FIRST_VALUE 28. LAST_VALUE 29. NTILE 30. CASE 31. WHEN 32. THEN 33. ELSE 34. END 35. CAST 36. AS 37. CONCAT 38. SUBSTR 39. LENGTH 40. TRIM 41. LOWER 42. UPPER 43. REPLACE 44. REGEXP_REPLACE 45. REGEXP_EXTRACT 46. SPLIT 47. EXPLODE 48. MAP 49. ARRAY 50. STRUCT 51. IF 52. COALESCE 53. NULLIF 54. NVL 55. NVL2 56. DATE 57. TIMESTAMP 58. CURRENT_DATE 59. CURRENT_TIMESTAMP 60. YEAR 61. MONTH 62. DAY 63. HOUR 64. MINUTE 65. SECOND 66. DATE_FORMAT 67. TO_DATE 68. TO_TIMESTAMP 69. INTERVAL 70. ADD_MONTHS 71. DATE_ADD 72. DATE_SUB 73. TRUNC 74. ROUND 75. CEIL 76. FLOOR 77. ABS 78. SIGN 79. EXP 80. LN 81. LOG10 82. POWER 83. SQRT 84. MOD 85. RAND 86. PI 87. E 88. CONCAT_WS 89. INITCAP 90. INSTR 91. LPAD 92. RPAD 93. REGEXP_INSTR 94. REGEXP_SUBSTR 95. REGEXP_LIKE 96. ARRAY_CONTAINS 97. ARRAY_SIZE 98. ARRAY_JOIN 99. ARRAY_FLATTEN 100. ARRAY_SLICE ### 回答2: 1. Hive(蜂巢) 2. Hadoop(哈多普) 3. 分布式(Distributed) 4. 大数据(Big Data) 5. 数据仓库(Data Warehouse) 6. 数据处理(Data Processing) 7. 结构化查询语言(SQL) 8. MapReduce(映射与归约) 9. 数据分析(Data Analysis) 10. 数据挖掘(Data Mining) 11. 数据仓库管理(Data Warehouse Management) 12. 数据提取(Data Extraction) 13. 数据转换(Data Transformation) 14. 数据加载(Data Loading) 15. 数据查询(Data Query) 16. HiveQL(Hive Query Language) 17. 数据存储(Data Storage) 18. 行式存储(Row Storage) 19. 列式存储(Column Storage) 20. 分区(Partition) 21. 桶(Bucket) 22. 元数据(Metadata) 23. 表(Table) 24. 外部表(External Table) 25. 内部表(Internal Table) 26. 聚合函数(Aggregate Functions) 27. Join(连接) 28. Group By(分组) 29. Sorting(排序) 30. 过滤(Filtering) 31. 聚合(Aggregation) 32. 数据类型(Data Types) 33. 字符串(String) 34. 数值(Numeric) 35. 布尔(Boolean) 36. 数组(Array) 37. 映射(Map) 38. 结构体(Struct) 39. 客户端(Client) 40. 服务端(Server) 41. 驱动器(Driver) 42. HDFS(Hadoop Distributed File System) 43. 数据节点(Data Node) 44. 元数据节点(Metadata Node) 45. 提交节点(Submit Node) 46. SQL解析器(SQL Parser) 47. 查询优化器(Query Optimizer) 48. 表分区(Table Partitioning) 49. 数据压缩(Data Compression) 50. 数据索引(Data Indexing) 51. UDF(User-Defined Functions) 52. UDAF(User-Defined Aggregation Functions) 53. UDTF(User-Defined Table-Generating Functions) 54. 内置函数(Built-in Functions) 55. 存储格式(Storage Formats) 56. ORC(Optimized Row Columnar) 57. Parquet(列式存储格式) 58. Avro(序列化系统) 59. RCFile(列式存储格式) 60. SequenceFile(二进制文件格式) 61. 文件格式转换(File Format Conversion) 62. 负载均衡(Load Balancing) 63. 故障恢复(Fault Tolerance) 64. 数据备份(Data Replication) 65. 高可用性(High Availability) 66. 安全性(Security) 67. 认证(Authentication) 68. 授权(Authorization) 69. 动态分区(Dynamic Partitioning) 70. 动态查询(Dynamic Query) 71. 执行计划(Execution Plan) 72. 基准测试(Benchmarking) 73. 批处理(Batch Processing) 74. 实时处理(Real-time Processing) 75. 数据可视化(Data Visualization) 76. NoSQL(非关系型数据库) 77. 跨集群复制(Federation) 78. 嵌套查询(Subquery) 79. 联合查询(Union) 80. 执行引擎(Execution Engine) 81. 元数据存储(Metadata Storage) 82. 统计信息(Statistics) 83. 数据分组(Data Grouping) 84. 数据复制(Data Replication) 85. 聚集索引(Clustered Index) 86. 临时表(Temporary Table) 87. 远程表(Remote Table) 88. 数据格式转换(Data Format Conversion) 89. 数据治理(Data Governance) 90. 数据质量(Data Quality) 91. 常规表达式(Regular Expressions) 92. 数据集成(Data Integration) 93. 存储过程(Stored Procedure) 94. 队列(Queue) 95. 日志(Log) 96. 调度器(Scheduler) 97. Map端(Mapper) 98. Reduce端(Reducer) 99. 数据分片(Data Sharding) 100. 高性能(High Performance)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值