STable使用示例

以温度传感器采集时序数据作为例,示范STable的使用。 在这个例子中,对每个温度计都会建立一张表,表名为温度计的ID,温度计读数的时刻记为ts,采集的值记为degree。通过tags给每个采集器打上不同的标签,其中记录温度计的地区和类型,以方便我们后面的查询。所有温度计的采集量都一样,因此我们用STable来定义表结构。

1:定义STable表结构并使用它创建子表

创建STable语句如下:

  1. CREATE TABLE thermometer (ts timestamp, degree double)
  2. TAGS(location binary(20), type int)

假设有北京,天津和上海三个地区的采集器共4个,温度采集器有3种类型,我们就可以对每个采集器建表如下:

  1. CREATE TABLE therm1 USING thermometer TAGS ('beijing', 1);
  2. CREATE TABLE therm2 USING thermometer TAGS ('beijing', 2);
  3. CREATE TABLE therm3 USING thermometer TAGS ('tianjin', 1);
  4. CREATE TABLE therm4 USING thermometer TAGS ('shanghai', 3);

其中therm1,therm2,therm3,therm4是超级表thermometer四个具体的子表,也即普通的Table。以therm1为例,它表示采集器therm1的数据,表结构完全由thermometer定义,标签location=”beijing”, type=1表示therm1的地区是北京,类型是第1类的温度计。

2:写入数据

注意,写入数据时不能直接对STable操作,而是要对每张子表进行操作。我们分别向四张表therm1,therm2, therm3, therm4写入一条数据,写入语句如下:

  1. INSERT INTO therm1 VALUES ('2018-01-01 00:00:00.000', 20);
  2. INSERT INTO therm2 VALUES ('2018-01-01 00:00:00.000', 21);
  3. INSERT INTO therm3 VALUES ('2018-01-01 00:00:00.000', 24);
  4. INSERT INTO therm4 VALUES ('2018-01-01 00:00:00.000', 23);

3:按标签聚合查询

查询位于北京(beijing)和天津(tianjing)两个地区的温度传感器采样值的数量count(*)、平均温度avg(degree)、最高温度max(degree)、最低温度min(degree),并将结果按所处地域(location)和传感器类型(type)进行聚合。

  1. SELECT COUNT(*), AVG(degree), MAX(degree), MIN(degree)
  2. FROM thermometer
  3. WHERE location='beijing' or location='tianjin'
  4. GROUP BY location, type

4:按时间周期聚合查询

查询仅位于北京以外地区的温度传感器最近24小时(24h)采样值的数量count(*)、平均温度avg(degree)、最高温度max(degree)和最低温度min(degree),将采集结果按照10分钟为周期进行聚合,并将结果按所处地域(location)和传感器类型(type)再次进行聚合。

  1. SELECT COUNT(*), AVG(degree), MAX(degree), MIN(degree)
  2. FROM thermometer
  3. WHERE location<>'beijing' and ts>=now-1d
  4. INTERVAL(10M)
  5. GROUP BY location, type