1. 程式人生 > 其它 >count()/sum() over(partition by) 詳解

count()/sum() over(partition by) 詳解

技術標籤:資料開發

1、建立表

create table orderinfo  --訂單資訊表
(
 order_no     VARCHAR2(20) , --訂單號
 product_no    VARCHAR2(10), --產品編號
 product_quantity VARCHAR2(1), --產品數量
 is_discount  VARCHAR2(2)   --是否折扣 1是0否
);

2、初始化資料

insert into orderinfo values('001','101','1','0');
insert into orderinfo values('001','102','2','0');
insert into orderinfo values('001','103','2','0');

insert into orderinfo values('002','201','2','1');
insert into orderinfo values('002','202','1','0');
insert into orderinfo values('002','203','1','1');

insert into orderinfo values('003','301','7','1');
insert into orderinfo values('003','302','1','0');
insert into orderinfo values('003','303','3','0');

insert into orderinfo values('004','401','3','1');
insert into orderinfo values('004','402','6','0');
insert into orderinfo values('004','403','9','1');
insert into orderinfo values('004','404','7','1');

3、需求:查詢表中資料,滿足一下三個條件

(1)每個訂單中產品數量大於3的產品至少1個(003,004)
(2)每個訂單中折扣標誌為'1'的產品至少有2個 (002,004)
(3)每個訂單中產品數量總和至少5個(001,004)

4、查詢程式碼

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 orderinfo) 
where cnt_1 >= 1 
and cnt_2 >= 2
and sum_5 >=5;

5、查詢結果

6、優點

程式碼簡單明瞭, 並且執行效率高。

如果不用這種函式去寫, 按照平時我們的思路首先想到的可能是子查詢,那麼將至少會走4次以上的全表掃描:

(1)每個訂單中產品數量大於3的產品至少1個(003,004)
(2)每個訂單中折扣標誌為'1'的產品至少有2個 (002,004)
(3)每個訂單中產品數量總和至少5個(001,004)

以上三種條件每個會走一次全表掃描,還需要從orderinfo表中過濾掉這三種情況,所以至少四次.

網友們如果有更好的方法可以給我留言,我們一起學習,共同進步哈!!!