首页 > 数据库 >Oracle 开窗函数 三个排序函数的区别

Oracle 开窗函数 三个排序函数的区别

时间:2023-04-20 16:56:04浏览次数:38  
标签:排序 函数 金额 开窗 Oracle 子表 主表 主键 select

1.ROW_NUMBER
2.RANK
3.DENSKRANK

这三个函数都是依托窗口函数进行的分组后的排序,对于排序的特点有些细节的区别

  1. ROW_NUMBER() 就是简单地按照Partition by要分组的字段排序,若order by后的字段值相同会区分出大小(原则不详),整体来说是的由1到N的排序
select t.*,row_number() over (partition by product_type order by sale_price) from product t
  1. Rank()相同合为一,跳跃排序。如果三个人,由两个人相同,则会显示1,2,2,4
select t.*,rank() over (partition by product_type order by sale_price) from product t
  1. DENSE_RANK相同为合一,连续排序。如果三个人中有两个相同,则会显示1,2,2,3
select t.*,dense_rank() over (partition by product_type order by sale_price) from product t

订单查询,订单表关联订单商品表,一对多关系,现在拉所有商品行为基础数据,金额统计用订单上的(不可描述的拆单活动金额拆分乱七八糟)金额

基础数据表结构

select 子表商品字段,主表金额字段 from 子表 left join 主表 on 主表.主键 = 子表.主表主键 

根据条件统计金额

select 子表商品字段,sum(主表金额字段) from 子表 left join 主表 on 主表.主键 = 子表.主表主键 where 条件

分析

  • sum(主表金额字段) 金额会跟子表商品行数增加
  • sum(子表金额字段) 金额并没有折分,其中还有促销活动类

解决办法 基础数据表结构改造

select 
  子表商品字段,
  case when 
    row_number() over(PARTITION BY 子表.主表主键 order by 子表id) = 1
  then 
    主表金额字段
  else 
    0 
  end 金额
from 子表 
left join 主表 on 主表.主键 = 子表.主表主键 

根据条件统计金额

select 子表商品字段,sum(金额) from 子表 left join 主表 on 主表.主键 = 子表.主表主键 where 条件

标签:排序,函数,金额,开窗,Oracle,子表,主表,主键,select
From: https://www.cnblogs.com/fuqian/p/17337404.html

相关文章

  • oracle 长事务处理过程
    1.定位具体xid和sql,可以看到回滚段大小,具体的sqlidSQL>@transSIDSERIAL#USERNAMEUSED_UBLKUSED_URECSTATUSSTART_DATEXID-----------------------------------------------------------------------------------------------4976069SYS 1 ......
  • oracle 插入字符串
    一直都认为oracle有插入方法,可是没找到,就写了一个凑合用写的是procedure,需要的可以把他改成function--插入字符串createorreplaceprocedureinsert_pro(strinvarchar2,--str为原字符串strindexinnumber,--strindex为插入的开始位置,会插入他的后边......
  • oracle 分页存储过程
     查询oracle时,做存储过程实现分页  createorreplaceprocedurequery_by_page(pagenuminnumber,pagesqlinvarchar2,pagesizeinnumber,pagecountoutnumber,allpagecountoutnumber,v_curoutquerypage.type_cur)asv_sqlvarchar2(3000);v_pbnumber;v_pd......
  • oracle 获取表,列注释
    前段时间,自己用的表好长,列好多(这是谁设计滴)所以给自己写了几个方法,贴出来晒晒,供以后使用: 获取列的注释createorreplacefunctionget_column_comment(tablenameinvarchar2,columnnameinvarchar2)returnvarchar2asv_commentuser_col_comments.comments%type;begin......
  • oracle 分区
    创建分区--先声明一下:列表分区不支持多列,但是范围分区和哈希分区支持多列。createtablegraderecord--范围分区根据列的值的范围(snovarchar2(10),snamevarchar2(20),dormitoryvarchar2(3),gradeint)partitionbyrange(grade)(partitionfailvalues......
  • oracle 语法备忘录
     --游标cursorobject_cursorisXXX;openobject_cursor;closeobject_cursor;   --引用游标typetype_my_ref_cursorisrefcursor;//refcursormy_ref_cursortype_my_ref_cursor;openmy_ref_cursorforXXXclosemy_ref_cursor;   --触发器createorrepl......
  • JavaScript函数基础语法
    ●我们代码里面所说的函数和我们上学的时候学习的什么三角函数、二次函数之类的不是一个东西函数的概念●对于js来说,函数就是把任意一段代码放在一个盒子里面●在我想要让这段代码执行的时候,直接执行这个盒子里面的代码就行●先看一段代码//这个是我们以前写的一段代码for......
  • 在运行时打印变量或对象类型的函数
    评:gettype()能显示一个变量的类型,比如“boolean”,“integer”,“double”,“string”,“array”,“object”等。get_class()能显示是哪一个类。instanceo()和java类似,判断是否是某个类的实例。......
  • Oracle CASE WHEN 用法介绍
    1.CASEWHEN表达式有两种形式 --简单Case函数CASEsexWHEN'1'THEN'男'WHEN'2'THEN'女'ELSE'其他'END--Case搜索函数CASEWHENsex='1'THEN'男'WHENsex='2'THEN'女&......
  • js 时间格式化 与 js 时间比较 函数
    评://对Date的扩展,将Date转化为指定格式的String//月(M)、日(d)、小时(h)、分(m)、秒(s)、季度(q)可以用1-2个占位符,//年(y)可以用1-4个占位符,毫秒(S)只能用1个占位符(是1-3位的数字)//例子://(newDate()).Format("yyyy-MM-dd......