ORCALE : 计算满足某种条件的连续日期的天数

最近有一个需求:查询满足某种条件的数据,且需求满足该条件连续的天数。

模拟一个场景:如下面这张表

求昨日,日销量大于5000的商店商品,且计算已经连续多少日。结果如下:

想法:

根据 门店编号,商品编号分组,日期倒序排序,求排名数,并且计算该条数据日期到今日的差值。

如果该差值等于排名数,这证明天数连续,count(*)求满足条件的数值。

SQL语句:

with tab as(
select
   row_number() over (partition by t.shop_no,t.product_no order by t.trade_date desc) rm, 
   to_date('2019-03-19','yyyy-mm-dd') - to_date(t.trade_date,'yyyy-mm-dd')+1 nday,
   t.shop_no,
   t.product_no
from TRADE_TAB t 
where t.del_flag = 0
and t.trade_amount >= 5000
)
,tab2 as(
select 
   tab.shop_no,
   tab.product_no,
   count(*) days  
from tab 
where tab.rm = tab.nday
group by tab.shop_no,tab.product_no
)
select 
    tab2.shop_no,
    tab2.product_no,
    tra.trade_amount,
    tra.trade_date,
    tab2.days
from tab2
left join TRADE_TAB tra
on tab2.shop_no = tra.shop_no and tab2.product_no = tra.product_no
where tra.trade_amount >= 5000
and tra.trade_date = '2019-03-19'
order by tab2.shop_no,tab2.product_no

建表语句

create table TRADE_TAB(
    OBJECID number(18) primary key not null,
    SHOP_NO VARCHAR2(10) not null,
    PRODUCT_NO VARCHAR2(10) not null,
    TRADE_AMOUNT NUMBER(22,6),
    TRADE_DATE VARCHAR2(20),
    DEL_FLAG INTEGER default 0,
    UPDATE_TIME DATE default sysdate,
    UPDATE_USER VARCHAR2(50)
)

select * from TRADE_TAB; 

insert into TRADE_TAB(OBJECID,SHOP_NO,PRODUCT_NO,TRADE_AMOUNT,TRADE_DATE) values(1,'S101','P201',6000.0,'2019-03-19');

insert into TRADE_TAB(OBJECID,SHOP_NO,PRODUCT_NO,TRADE_AMOUNT,TRADE_DATE) values(2,'S101','P201',5500.0,'2019-03-18');
insert into TRADE_TAB(OBJECID,SHOP_NO,PRODUCT_NO,TRADE_AMOUNT,TRADE_DATE) values(3,'S101','P201',4500.0,'2019-03-17');
insert into TRADE_TAB(OBJECID,SHOP_NO,PRODUCT_NO,TRADE_AMOUNT,TRADE_DATE) values(4,'S101','P201',6500.0,'2019-03-16');
insert into TRADE_TAB(OBJECID,SHOP_NO,PRODUCT_NO,TRADE_AMOUNT,TRADE_DATE) values(5,'S101','P202',5100.0,'2019-03-19');
insert into TRADE_TAB(OBJECID,SHOP_NO,PRODUCT_NO,TRADE_AMOUNT,TRADE_DATE) values(6,'S101','P202',3500.0,'2019-03-18');
insert into TRADE_TAB(OBJECID,SHOP_NO,PRODUCT_NO,TRADE_AMOUNT,TRADE_DATE) values(7,'S101','P202',4000.0,'2019-03-17');
insert into TRADE_TAB(OBJECID,SHOP_NO,PRODUCT_NO,TRADE_AMOUNT,TRADE_DATE) values(8,'S101','P202',4500.0,'2019-03-16');
insert into TRADE_TAB(OBJECID,SHOP_NO,PRODUCT_NO,TRADE_AMOUNT,TRADE_DATE) values(9,'S101','P203',4000.0,'2019-03-19');
insert into TRADE_TAB(OBJECID,SHOP_NO,PRODUCT_NO,TRADE_AMOUNT,TRADE_DATE) values(10,'S101','P203',4500.0,'2019-03-18');
insert into TRADE_TAB(OBJECID,SHOP_NO,PRODUCT_NO,TRADE_AMOUNT,TRADE_DATE) values(11,'S101','P203',5500.0,'2019-03-17');
insert into TRADE_TAB(OBJECID,SHOP_NO,PRODUCT_NO,TRADE_AMOUNT,TRADE_DATE) values(12,'S101','P203',5400.0,'2019-03-16');

insert into TRADE_TAB(OBJECID,SHOP_NO,PRODUCT_NO,TRADE_AMOUNT,TRADE_DATE) values(13,'S102','P201',5000.0,'2019-03-19');
insert into TRADE_TAB(OBJECID,SHOP_NO,PRODUCT_NO,TRADE_AMOUNT,TRADE_DATE) values(14,'S102','P201',4800.0,'2019-03-18');
insert into TRADE_TAB(OBJECID,SHOP_NO,PRODUCT_NO,TRADE_AMOUNT,TRADE_DATE) values(15,'S102','P201',5000.0,'2019-03-17');
insert into TRADE_TAB(OBJECID,SHOP_NO,PRODUCT_NO,TRADE_AMOUNT,TRADE_DATE) values(16,'S102','P201',4000.0,'2019-03-16');
insert into TRADE_TAB(OBJECID,SHOP_NO,PRODUCT_NO,TRADE_AMOUNT,TRADE_DATE) values(17,'S102','P202',6000.0,'2019-03-19');
insert into TRADE_TAB(OBJECID,SHOP_NO,PRODUCT_NO,TRADE_AMOUNT,TRADE_DATE) values(18,'S102','P202',5300.0,'2019-03-18');
insert into TRADE_TAB(OBJECID,SHOP_NO,PRODUCT_NO,TRADE_AMOUNT,TRADE_DATE) values(19,'S102','P202',5800.0,'2019-03-17');
insert into TRADE_TAB(OBJECID,SHOP_NO,PRODUCT_NO,TRADE_AMOUNT,TRADE_DATE) values(20,'S102','P202',4900.0,'2019-03-16');
insert into TRADE_TAB(OBJECID,SHOP_NO,PRODUCT_NO,TRADE_AMOUNT,TRADE_DATE) values(21,'S102','P203',5100.0,'2019-03-19');
insert into TRADE_TAB(OBJECID,SHOP_NO,PRODUCT_NO,TRADE_AMOUNT,TRADE_DATE) values(22,'S102','P203',4800.0,'2019-03-18');
insert into TRADE_TAB(OBJECID,SHOP_NO,PRODUCT_NO,TRADE_AMOUNT,TRADE_DATE) values(23,'S102','P203',4500.0,'2019-03-17');
insert into TRADE_TAB(OBJECID,SHOP_NO,PRODUCT_NO,TRADE_AMOUNT,TRADE_DATE) values(24,'S102','P203',5000.0,'2019-03-16');
发布了73 篇原创文章 · 获赞 78 · 访问量 9万+

猜你喜欢

转载自blog.csdn.net/SHIYUN123zw/article/details/88682611
今日推荐