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');