count()/sum() over(partition by) 詳解
阿新 • • 發佈:2020-12-17
技術標籤:資料開發
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表中過濾掉這三種情況,所以至少四次.
網友們如果有更好的方法可以給我留言,我們一起學習,共同進步哈!!!