interval

语法

interval(X, duration, fill, [step], [explicitOffset=false])

参数

X 是一个向量,必须是整数向量或者时间类型向量(如时间列)。

duration 是一个整数或者DURATION类型数据。支持的时间单位为:y, M, w, d, H, m, s, ms, us, ns。

fill 是缺失值的填充方式,可取值为:”prev”, “post”, “linear”, “null”, 具体数值和”none”。

  • “prev”:缺失值使用前一个值填充。

  • “post”:缺失值使用后一个值填充。

  • “linear”:缺失值使用线性插值填充。对于非数值列,无法使用线性插值填充,这种情况下会使用”prev”的方式填充。

  • “null”:缺失值使用null值填充。

  • 具体数值:一个数字。

  • “none”:表示不进行插值。

step 是可选参数,是一个整数或者DURATION类型数据,表示计算窗口每次向前滑动的步长,必须为一个可以整除duration的数。 通过 step 可以指定一个比 duration 更小的滑动步长。默认与 duration 设置值相同,即计算窗口以 duration 的步长滑动。

注:指定 step 后,不支持以下聚合计算:atImax, atImin, difference, imax, imin, lastNot, mode, percentile。

explicitOffset 是可选参数,是一个布尔值,表示where指定条件后,插值起始窗口是否以where指定的起始值开始。true表示以where指定的起始值开始。

详情

该函数只能在group by子句中使用,以实现插值查询,不能单独使用。该函数将 Xduration 指定的长度分组以进行计算。若某组无数据,根据 fill 参数指定的方式填充缺失值。

注意:从1.30.14版本开始,取消了range参数。

下图以 duration = 2 * step 为例,进一步解释插值窗口如何进行滑动计算(出现NULL的窗口需要 fill 进行填充):

../_images/interval01.png

下图解释了 explicitOffset 不同设置下,插值起始窗口如何确定。图中where条件指定起始值为t3,t3前最近的一个能整除 step 的值为t’,当 explicitOffset 设置为true时,插值起始窗口以t3开始,当 explicitOffset 设置为false时,插值起始窗口以t’开始。

../_images/interval02.png

例子

使用前一个值填充:

$ timestampv = temporalAdd(2012.01.01T00:00:00.000, [0, 1, 2, 4, 8, 9, 10, 11, 15, 20], "s")
$ symbolv = take(`A`B`C, 10)
$ a1v = double(1..10)
$ t = table(timestampv as timestamp, symbolv as symbol, a1v as a1)

$ select max(a1) from t group by interval(timestamp, 3000ms, "prev")

使用指定数字填充:

$ select max(a1) from t group by interval(timestamp, 3000ms, 100)

下例说明 explicitOffset 不同设置下,起始窗口的显示。

$ symbol = `C`C`C`C`C`C`MS`MS`MS`MS
$ price= 29.6 29.46 29.52 30.02 30.17 30.23 50.76 50.32 51.29 53.23
$ volume = 2200 1900 2100 3200 6800 5400 1300 2500 8800 5800
$ date = [2012.01.01, 2012.01.01, 2012.01.01, 2012.01.03, 2012.01.05, 2012.01.06, 2012.01.02, 2012.01.02, 2012.01.04, 2012.01.06]
$ second = [09:34:07,09:34:42,09:34:51,09:34:59,09:35:47,09:35:26,09:35:36,09:36:26,09:37:12,10:00:00]
$ t = table(date, second, symbol, volume, price)
//explicitOffset设置为true时,起始窗口以where指定的起始值09:33:50开始。
$ select max(volume) as max_volume, avg(price) as avg_price from t where second between 09:33:50:09:35:00 group by symbol, date, interval(second, 30, "prev", ,true) as second

symbol

date

second

max_volume

avg_price

C

2012.01.01

09:33:50

2200

29.6

C

2012.01.01

09:34:20

1900

29.46

C

2012.01.01

09:34:50

2100

29.52

C

2012.01.03

09:33:50

C

2012.01.03

09:34:20

C

2012.01.03

09:34:50

3200

30.02

explicitOffset 设置为false,起始窗口以where指定的起始值前第一个可以整除 step 的值开始,本例中where的起始值为09:33:30,stepduration (即时间点为second(09:33:50/30*30))。

$ select max(volume) as max_volume, avg(price) as avg_price from t where second between 09:33:50:09:35:00 group by symbol, date, interval(second, 30, "prev", ,false) as second

symbol

date

second

max_volume

avg_price

C

2012.01.01

09:33:30

C

2012.01.01

09:34:00

2200

29.6

C

2012.01.01

09:34:30

2100

29.49

C

2012.01.01

09:35:00

2100

29.49

C

2012.01.03

09:33:30

C

2012.01.03

09:34:00

C

2012.01.03

09:34:30

3200

30.02

C

2012.01.03

09:35:00

3200

30.02

下例指定step为20s,计算窗口长度为60s,每20s向前滑动一次,进行计算。

$ select max(volume) as max_volume, avg(price) as avg_price from t where second between 09:33:50:09:35:00 group by symbol, date, interval(second, 60, 0,20 ,false) as second

symbol

date

second

max_volume

avg_price

C

2012.01.01

09:33:40

0

0

C

2012.01.01

09:34:00

2200

29.5267

C

2012.01.01

09:34:20

0

0

C

2012.01.01

09:34:40

2100

29.49

C

2012.01.01

09:35:00

0

0

C

2012.01.03

09:33:40

0

0

C

2012.01.03

09:34:00

0

0

C

2012.01.03

09:34:20

0

0

C

2012.01.03

09:34:40

3200

30.02

C

2012.01.03

09:35:00

0

0