10M假设一个消费记录表,有消费记录,每次消费都有一条记录,包括消费时间、消费学号、消费金额等。
然后我现在想查询有超过15天没有消费记录的学号名单,该如何谢这个sql呢?
谢谢!
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天没消费的,而是之前一段时间中,有15天没消费的
评论
有用 0不是当前时间的话,那你看看这个列子,应该能帮到你
评论
有用 0首先,此人必须在消费表中至少有一条记录。
其次,15天没有消费,有两种情况。
情况一:8月1日消费了,至今再没有第二次消费。
情况二:8月1日消费了,8月17日也消费了。这期间有16天没有消费。
现在需要把这两种情况都列出来?
评论
有用 1用分析函数lead或者lag,按学号分组,按时间排序,把相邻两行的时间放到一行上,相减,得到所有相邻两次消费的时间差,最后再用这个时间差过滤出超过15天的数据,对学号去重即可
评论
有用 2窗口函数 ,当前记录减上一条记录日期 >15就可以了
评论
有用 1sql菜鸟试着答一下
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
墨值悬赏


