首页 > 数据库 >Oracle分析函数- count()/sum() over(partition by 分组 order by 排序) 详解

Oracle分析函数- count()/sum() over(partition by 分组 order by 排序) 详解

时间:2024-04-10 16:23:11浏览次数:27  
标签:count insert orderinfo sum partition cux values 004 into

优点:代码简单明了, 并且执行效率高,(不影响总的记录数)

如果不用这种函数去写, 按照平时我们的思路首先想到的可能是子查询,那么将至少会走4次以上的全表扫描:

(1)每个订单中产品数量大于3的产品至少1个(003,004)
(2)每个订单中折扣标志为'1'的产品至少有2个 (002,004)
(3)每个订单中产品数量总和至少5个(001,004)

以上三种条件每个会走一次全表扫描,还需要从orderinfo表中过滤掉这三种情况,所以至少四次.

 创建表

 -- 订单信息表 
 create table cux_orderinfo(
  order_no          VARCHAR2(20),--订单号
  product_no        VARCHAR2(10),--产品编号
  product_quantity  VARCHAR2(1), --产品数量
  is_discount       VARCHAR2(2)  --是否折扣 1是0否
);  

 

初始数据

insert into cux_orderinfo values('001','101','1','0');
insert into cux_orderinfo values('001','102','2','0');
insert into cux_orderinfo values('001','103','2','0');
 
insert into cux_orderinfo values('002','201','2','1');
insert into cux_orderinfo values('002','202','1','0');
insert into cux_orderinfo values('002','203','1','1');
 
insert into cux_orderinfo values('003','301','7','1');
insert into cux_orderinfo values('003','302','1','0');
insert into cux_orderinfo values('003','303','3','0');
 
insert into cux_orderinfo values('004','401','3','1');
insert into cux_orderinfo values('004','402','6','0');
insert into cux_orderinfo values('004','403','9','1');
insert into cux_orderinfo values('004','404','7','1');

 

3、需求:查询表中数据,满足一下三个条件
(1)每个订单中产品数量大于3的产品至少1个(003,004)
(2)每个订单中折扣标志为'1'的产品至少有2个 (002,004)
(3)每个订单中产品数量总和至少5个(001,004)

select *
  from (select order_no,
               product_no,
               product_quantity,
               is_discount,
               count(case
                       when product_quantity > 3 then
                        1
                     end) over(partition by order_no) cnt_1, --每个订单中产品数量大于3的产品个数
               count(case
                       when is_discount = '1' then
                        1
                     end) over(partition by order_no) cnt_2, --每个订单中折扣标志为‘1’的产品个数
               sum(product_quantity) over(partition by order_no) sum_5 --每个订单中的产品总数
          from cux_orderinfo)
 where cnt_1 >= 1
   and cnt_2 >= 2
   and sum_5 >= 5;
View Code

 

 

标签:count,insert,orderinfo,sum,partition,cux,values,004,into
From: https://www.cnblogs.com/ivenlin/p/18126279

相关文章

  • 抢先看!Summer '24即将发布,如何提早准备?
    当Salesforce组织推出Summer'24版本时,将自动启用许多版本更新。请务必查看以下列表,以便组织做好相应准备,并根据组织的更新情况查看截止日期,留出充足的时间。在生产环境中规划更改时,请在工作时间之外进行更改,以便可以在用户和客户端离线时进行测试。这样,如果出现问题,可以在影响......
  • Counter 1000
    Froma1000Hzclock,derivea1Hzsignal,calledOneHertz,thatcouldbeusedtodriveanEnablesignalforasetofhour/minute/secondcounterstocreateadigitalwallclock.Sincewewanttheclocktocountoncepersecond,theOneHertzsignalmustb......
  • CF1748E Yet Another Array Counting Problem の Solution
    Link有些人还是啥都不会。看到题目应该能想到这是笛卡尔树的性质,因为每一对\((l,r)\)都满足最左端最大值位置相同,所以说明在笛卡尔树上,每一对点的lca相同,说明\(a\)和\(b\)序列的笛卡尔树相同。我们以下标为键,\(a_i\)为值建立大根笛卡尔树,现在题目就转换成在这个树上填......
  • CountdownEvent
    CountdownEvent的注释为:表示在计数变为零时处于有信号状态的同步基元它是一个同步基元,它在收到一定次数的信号之后,将会解除对其等待线程的锁定。简的来说就是,事先设置需要有多少个通知,等待指定的通知数量全部到达后,Wait()才继续往下运行。代码示例如下:staticvoidMain(str......
  • sudo fdisk -l命令出现警告:Partition 1 does not start on physical sector boundary
    出现这个警告的原因是分区起点不在物理扇区边界。用我们的常用的说法就是存在分区未4K对齐,下面浅浅解释一下:早期的硬盘一个扇区的大小是512个字节,后来随之磁盘容量的不断增加和读写效率提升的要求,国际硬盘协会制定了全新标准,将每个扇区的大小调整为4096个字节,也就是4KB,这种扇区又......
  • 并发工具类:ExecutorService、Future、CountDownLatch与Semaphore(第一章)
    目录一、引言ExecutorService与Future:优雅的任务提交与结果获取CountDownLatch:精确的线程同步点Semaphore:资源访问的流量控制器总结二、ExecutorService定义与接口概述生命周期管理高级特性与最佳实践使用ExecutorService时的常见注意事项与最佳实践建议一、引言......
  • Hadoop集群下的wordcount运行出错类型及解决方法
    1、启动wordcont程序显示异常:原因:2、显示服务器连接不成功:原因:虚拟机配置问题,导致yarn服务没有启动3、运行结果不正确:原因:暂未发现,求解答......
  • SQL 查找是否存在”,别再用 COUNT 了。
    根据某一条件从数据库表中查询『有』与『没有』,只有两种状态,那为什么在写SQL的时候,还要SELECTcount(*)呢?无论是刚入道的程序员新星,还是精湛沙场多年的程序员老手,都是一如既往的count目前多数人的写法多次REVIEW代码时,发现如现现象:业务代码中,需要根据一个或多个条件,查询是否存在......
  • 【WEEK6】Learning Objectives and Summaries【MySQL】【English Version】
    LearningObjectives:TwoweekstofinishlearningMySQL-WeektwoLearningContent:Referencevideotutorials【狂神说Java】MySQL最新教程通俗易懂QuerydatabyDQLMySQLfunctionsMD5encryptionTransactionsLearningtimeandoutputs:Week6MON~WED,SUN......
  • MySQL中COUNT(1)、COUNT(*)、COUNT(字段)
    COUNT1):COUNT(1)会统计符合条件的结果集的行数,表示统计结果集中的行数,而括号内的值不影响结果。使用COUNT(1)可以更快地执行统计,因为不需要实际检查行的数据内容。COUNT(*):COUNT(*)会统计符合条件的结果集的行数,与COUNT(1)类似,但不同的是COUNT(*)会检查行中具体的数据......