一个SQL问题,涉及较复杂的时间处理,新手求解。

写一个简单示例,一张用户借贷的数据表Loan,含用户id,借款金额和时间戳。

建表语句如下:

CREATE TABLE Loan,
(
 id varchar(31),
 user_id varchar(31),
 amount int,
 create_time timestamp,
 primary key(id)
);

INSERT INTO Loan VALUES (1, 'u1', 1000, '2018-10-10 00:00:00');
INSERT INTO Loan VALUES (2, 'u2', 2000, '2018-10-20 00:00:00');
INSERT INTO Loan VALUES (3, 'u1', 3000, '2018-11-08 00:00:00');
INSERT INTO Loan VALUES (4, 'u2', 4000, '2018-11-22 00:00:00');
INSERT INTO Loan VALUES (5, 'u2', 2000, '2018-12-05 00:00:00');

希望的得到得结果为
图片说明

  • 所在周的形式需要如图所示,这也是我最不清楚如何处理的,week函数只能返回所在当年的第几周;
  • 当月发生多次借款用户,即用户第一次借款的一个月内,又发生了至少一次借款行为。

涉及到多个时间处理问题,求解答多谢。

数据库设计有问题,直接添加个月份,按月份来算,就简单了
201810 u1
201810 u1
201811 u2
要不,还得用代码来算时差

如果不怕麻烦用代码算的话,就看下这个吧

https://blog.csdn.net/kexiaoling/article/details/50495540

这个结果不可能由sql直接得到,要程序代码生成才行,或者建立临时表,多步查询

这个时间你看我这种方式是否可行:
1.通过date_format(date,'%w')函数获取到今天是星期几
2.再通过DATE_ADD(date,INTERVAL n DAY)函数获取到当前周周1的日期和当前周周日的日期
3.再通过CONCAT(date1,'-',date2)就获取到了第一个字段

我想第一个字段出来了其他的你应该都好解决了吧

感觉这样的事情要三个表(或者两个表)比较好,比如一个周表(ID ,周的开始,结束),一个连接表(借款ID,周ID)//这个也可以省略.
然后抽取的时候SQL就简单了,对于大量的数据处理的话,效率要远高于加运算(函数)在SQL上。

本质就是要设计一些master table, 一些是业务表。

利用用户主表与业务表进行对照查询,再利用子查询数据集生成一个临时表即可

select CONCAT(date_format(DATE_ADD(create_time,INTERVAL -(DAYOFWEEK(create_time)-1) day),'%Y%m%d'),'-',date_format(DATE_ADD(create_time,INTERVAL 7-DAYOFWEEK(create_time) day),'%Y%m%d')) from Loan
时间范围就这样算,至于什么用户数,在你的示例里,同一个月的两周,当月多次借款用户都不同,你到底想表达什么?如果同一个月,不同周的当月多次借款可以不同,那根本就是以周来算而不是按月。
想找时间在哪周,where date_format(now(),'%Y%m%d') between left(xxx,8) and right(xxx,8),now、xxx替换掉,其他自己动脑筋。

select distinct week.t,mx.cnt,loan.amount ,mx.user_id from
(select to_char(trunc(create_time,'WW'),'yyyymmdd')||'-'||to_char(trunc(create_time,'WW')+7,'yyyymmdd') t,to_char(create_time,'WW') num
from loan ) week,
(select to_char(create_time,'WW') ct,user_id,count(*) cnt,min(rowid) rid from Loan group by to_char(create_time,'WW'),user_id) mx,
loan
where week.num=mx.ct
and mx.rid=loan.rowid
order by week.t

1 20181008-20181015 3 1000 u1
2 20181015-20181022 1 2000 u2
3 20181105-20181112 1 3000 u1
4 20181119-20181126 1 4000 u2
5 20181203-20181210 1 2000 u2