计算每个人创建项目的平均间隔

例题描述和简单分析

某数据库中有表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