暂无图片
如何在Oracle查询超过多少天没有记录的数据?
我来答
分享
baalchina
2022-09-09
如何在Oracle查询超过多少天没有记录的数据?
暂无图片 10M

假设一个消费记录表,有消费记录,每次消费都有一条记录,包括消费时间、消费学号、消费金额等。


然后我现在想查询有超过15天没有消费记录的学号名单,该如何谢这个sql呢?


谢谢!

我来答
添加附件
收藏
分享
问题补充
8条回答
默认
最新
Thomas

create table tb_order(name varchar2(20),order_date date);
insert into tb_order values ('A',date '2022-08-20');
insert into tb_order values ('B',date '2021-01-20');
insert into tb_order values ('B',date '2021-02-01');
insert into tb_order values ('B',date '2021-03-01');
insert into tb_order values ('B',date '2021-03-18');
insert into tb_order values ('C',date '2022-08-18');
insert into tb_order values ('C',date '2022-09-01');
commit;

SQL> select * from tb_order;

NAME ORDER_DATE
------------------------------------------------------------ -------------------
A 2022-08-20 00:00:00
B 2021-01-20 00:00:00
B 2021-02-01 00:00:00
B 2021-03-01 00:00:00
B 2021-03-18 00:00:00
C 2022-08-18 00:00:00
C 2022-09-01 00:00:00

考虑了我说的两种情况:

with t as
(select name,order_date from tb_order union all
select distinct name,sysdate as order_date from tb_order order by name,order_date),
s as
(select t.*,lag(order_date,1,null) over (partition by name order by order_date) as prior_order_date from t)
select name,count(*) from s where order_date -prior_order_date>15 group by name;

NAME COUNT(*)
------------------------------------------------------------ ----------
A 1
B 3

暂无图片 评论
暂无图片 有用 1
暂无图片
布衣
暂无图片

当前时间减“消费时间” >=15天 这样可以吗?

暂无图片 评论
暂无图片 有用 1
baalchina
题主
2022-09-09
不一定行。我要统计的不是截止到今天15天没消费的,而是之前一段时间中,有15天没消费的
baalchina

不一定行。我要统计的不是截止到今天15天没消费的,而是之前一段时间中,有15天没消费的

暂无图片 评论
暂无图片 有用 0
布衣
2022-09-09
就是统计学号,消费频率,消费频率低于15天的列出来?
刘贵宾

不是当前时间的话,那你看看这个列子,应该能帮到你

https://www.modb.pro/db/50441

暂无图片 评论
暂无图片 有用 0
布衣
2022-09-09
应该是这个逻辑。。可以按这个例子试试。
Thomas

首先,此人必须在消费表中至少有一条记录。

其次,15天没有消费,有两种情况。

情况一:8月1日消费了,至今再没有第二次消费。

情况二:8月1日消费了,8月17日也消费了。这期间有16天没有消费。

现在需要把这两种情况都列出来?

暂无图片 评论
暂无图片 有用 1
baalchina
题主
2022-09-09
对的,就是从他最近的一条消费记录开始,直到今天,有15天没有记录,把这些人筛选出来就ok了
DarkAthena

用分析函数lead或者lag,按学号分组,按时间排序,把相邻两行的时间放到一行上,相减,得到所有相邻两次消费的时间差,最后再用这个时间差过滤出超过15天的数据,对学号去重即可

暂无图片 评论
暂无图片 有用 2
chengang

窗口函数 ,当前记录减上一条记录日期 >15就可以了

暂无图片 评论
暂无图片 有用 1
农夫三拳

sql菜鸟试着答一下

1、有一个学号表,记录所有的学号,防止从来未消费的学生

select * from students

    ID
 10001
 10002
 10003
 10004
 10005

2、消费表

select * from ord

ID ORDER_TIME
10001 2022-09-09
10002 2022-09-08
10001 2022-08-24
10005 2022-05-10
10003 2022-09-01

3、查询,全量id减去15天之内有消费的id

select id from students minus select distinct id from ord where order_time> sysdate-15;

ID
10004
10005

暂无图片 评论
暂无图片 有用 1
回答交流
提交
问题信息
请登录之后查看
邀请回答
暂无人订阅该标签,敬请期待~~
暂无图片墨值悬赏