计算每个人创建项目的平均间隔
例题描述和简单分析
某数据库中有表PROJECTS,部分数据如下所示:
UID |
PD |
1 |
3-Jan-2001 |
1 |
18-Feb-2001 |
1 |
22-Jul-2001 |
2 |
12-Sep-2000 |
2 |
20-Nov-2000 |
2 |
4-Apr-2001 |
… |
… |
UID 是用户编号,PD 是项目创建日期,需要计算每个人项目创建的平均间隔(月),部分结果如下:
pc |
avg |
1 |
0 |
2 |
4 |
3 |
4 |
4 |
2 |
… |
… |
解法及简要说明
在集算器中编写脚本p1.dfx,如下所示:
A |
|
1 |
=connect("demo") |
2 |
=A1.query@x("SELECT * FROM PROJECTS ORDER BY UID,PD").group(UID).(~.(interval@m(PD[-1],PD))).run(~(1)=0) |
3 |
>pm=A2.max(~.len()) |
4 |
=A2.(~.pad(0,pm)) |
5 |
=transpose(A4).new(#:pc,int(ceil(avg(~))):avg) |
简要说明:
A1 连接数据源名称为 demo 的数据库
A2 返回查询结果所组成的序表,结束时自动关闭数据库连接。序表按 UID 分组,计算每组内的项目创建日期与上一个项目创建日期的月份差,每组第一个值赋 0
A3 设变量 pm(单个用户的最大项目数)并计算该值
A4 A2(序列的序列)按 pm 值补 0
A5 转置 A4,计算结果
JAVA 集成这段代码的方法可参考:《Java 如何调用 SPL 脚本》。
https://stackoverflow.com/questions/64145457/calculating-average-time-between-dates-in-sql
英文版