SQL

GreptimeDB 在查询数据时支持完整的 SQL 语法。这里有一些示例通过 SQL 语句和 GreptimeDB 函数来查询 monitor 表中的数据。

关于如何创建 monitor 表格并向其中插入数据,请参考表管理写入数据

SELECT

使用 SELECT 查询表中的全部数据:

sql

  1. SELECT * FROM monitor;

The query result looks like the following:

sql

  1. +-----------+---------------------+------+--------+
  2. | host | ts | cpu | memory |
  3. +-----------+---------------------+------+--------+
  4. | 127.0.0.1 | 2022-11-03 03:39:57 | 0.1 | 0.4 |
  5. | 127.0.0.1 | 2022-11-03 03:39:58 | 0.5 | 0.2 |
  6. | 127.0.0.2 | 2022-11-03 03:39:58 | 0.2 | 0.3 |
  7. +-----------+---------------------+------+--------+
  8. 3 rows in set (0.00 sec)

请前往 SELECT 查看更多.

函数

使用 count() 函数获取表中的全部行数:

sql

  1. SELECT count(*) FROM monitor;

sql

  1. +-----------------+
  2. | COUNT(UInt8(1)) |
  3. +-----------------+
  4. | 3 |
  5. +-----------------+

avg() 函数返回某个字段中所有数值的平均值:

sql

  1. SELECT avg(cpu) FROM monitor;

sql

  1. +---------------------+
  2. | AVG(monitor.cpu) |
  3. +---------------------+
  4. | 0.26666666666666666 |
  5. +---------------------+
  6. 1 row in set (0.00 sec)

请前往 Functions 查看更多.

Group By

你可以使用 GROUP BY 语句将具有相同值的行进行分组汇总,例如查询 idc 列中的所有不同值的内存均值:

sql

  1. SELECT host, avg(cpu) FROM monitor GROUP BY host;

sql

  1. +-----------+------------------+
  2. | host | AVG(monitor.cpu) |
  3. +-----------+------------------+
  4. | 127.0.0.2 | 0.2 |
  5. | 127.0.0.1 | 0.3 |
  6. +-----------+------------------+
  7. 2 rows in set (0.00 sec)

请参考 GROUP BY 获取更多相关信息。

日期和时间示例

查询最近 5 分钟内的数据

sql

  1. SELECT * from monitor WHERE ts >= now() - INTERVAL '5 minutes';

请参考 INTERVAL 获取更多信息。

将数字转换为时间戳

sql

  1. select * from monitor where ts > arrow_cast(1650252336408, 'Timestamp(Millisecond, None)')

这个查询将数字 1650252336408(Unix Epoch 2022-04-18 03:25:36.408,毫秒分辨率)转换为带有毫秒精度的时间戳类型。

请参考 arrow_cast 获取更多信息.

将字符串时间转换为时间戳

sql

  1. select * from monitor where ts > '2022-07-25 10:32:16.408'::timestamp

这个查询使用 :: 语法将字符串时间转换为时间戳类型,所有 SQL 类型都可以在 timestamp 的位置上使用。

请参考 ::timestamp 获取更多信息.

从时间戳中提取一年中的第几天

sql

  1. MySQL [(none)]> SELECT date_part('DOY', '2021-07-01 00:00:00');

Output:

sql

  1. +----------------------------------------------------+
  2. | date_part(Utf8("DOY"),Utf8("2021-07-01 00:00:00")) |
  3. +----------------------------------------------------+
  4. | 182 |
  5. +----------------------------------------------------+
  6. 1 row in set (0.003 sec)

SQL 语句中的 DOYday of the year 的缩写。请参考 date_part 获取更多信息。

HTTP API

在 HTTP 请求中使用 POST 方法来查询数据:

shell

  1. curl -X POST \
  2. -H 'authorization: Basic {{authorization if exists}}' \
  3. -H 'Content-Type: application/x-www-form-urlencoded' \
  4. -d 'sql=select * from monitor' \
  5. http://localhost:4000/v1/sql?db=public

结果如下:

json

  1. {
  2. "code": 0,
  3. "output": [
  4. {
  5. "records": {
  6. "schema": {
  7. "column_schemas": [
  8. {
  9. "name": "host",
  10. "data_type": "String"
  11. },
  12. {
  13. "name": "ts",
  14. "data_type": "TimestampMillisecond"
  15. },
  16. {
  17. "name": "cpu",
  18. "data_type": "Float64"
  19. },
  20. {
  21. "name": "memory",
  22. "data_type": "Float64"
  23. }
  24. ]
  25. },
  26. "rows": [
  27. ["127.0.0.1", 1667446797450, 0.1, 0.4],
  28. ["127.0.0.1", 1667446798450, 0.5, 0.2],
  29. ["127.0.0.2", 1667446798450, 0.2, 0.3]
  30. ]
  31. }
  32. }
  33. ],
  34. "execution_time_ms": 0
  35. }

请参考 API 文档获取更详细的 HTTP 请求的内容。