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

博客围绕一个需求展开,即查询满足特定条件的数据并计算连续天数。以商店商品日销量为例,介绍了通过按门店编号、商品编号分组,日期倒序排序求排名数,计算日期差值判断天数是否连续,最后用SQL语句实现该查询。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

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

求昨日,日销量大于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');

 

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值