以下是 SnQL 查询结构:
这些查询作为字符串发送到 /:dataset/snql 端点,编码为以下格式的 JSON body:
数据集(dataset)通过查询使用的 url 隐含JSON除了 query 以外的所有字段都是可选的。
MATCH
我们的数据模型由实体图表示。子句标记了我们正在查询的子图(subgraphs)的模式。目前支持三种类型的 MATCH 子句:
Simple:
这相当于我们目前的所有查询。这是从单个实体(事件、事务等)查询数据。)。可以添加到查询中添加可选 sample。
例如:MATCH (events)
Subquery:
另一个完整的 可以在花括号SQL 查询。子查询 SELECT/BY 子句中的任何内容都将在外部查询中使用指定的别名进行公开。
例如:
Join(连接):
一个 join 代表多节点子图(subgraph),是一个包含不同节点之间的多个关系的子图。目前支持节点之间的 1..n、n..1 和 1..1 有向关系。
对于 JOIN,每个实体都必须有一个别名,这是唯一的字符串。(Sampling)也可用于 join 中的任何实体。Snuba 中的 Entity 中指定的字符串是一组 join 条件简写。可以有多个 join 用逗号分隔子句。
例如:
join 类型(left/inner)和 join key 是数据模型的一部分,而不是查询的一部分。它们在物理代码中被硬编码。这是因为没有物理可以安全地连接到底层数据库分布式版本中的任何其他物理。
match 子句提供给 where 子句元组(tuple)看起来像传统 join 子句产生的元组完全相同:
SELECT .. BY
该子句指定了输出中应返回的结果。如果有聚合物(aggregation),则 BY 子句中的所有内容都被视为分组 key。如果我们想聚合整个结果集,我们可以没有 BY 子句聚合,但在这种情况下,SELECT 只能包含聚合物。即使有 BY 子句,空 SELECT 子句也无效。
SELECT 句子中的表达式可以是列、算术、函数或任何组合。如果查询是 join,每列必须有一个合格的别名,这个别名和 MATCH 匹配子句中的实体别名之一。
WHERE
这是聚合前查询的过滤器(如 SQL 中的 WHERE)。
条件是 LHS OP RHS* 形式的中缀表达式,包括 LHS 和 RHS 是字面值或表达式。OP 指的是一个特定的运算符来比较两个值。这些运算符是 =、!=、<、<=、>、>=、IN、NOT IN、LIKE、NOT LIKE、IS NULL、IS NOT NULL 之一IS NULL 这样的运算符,RHS 是可选的。
可使用布尔关键字 AND 或 OR 组合条件。也可以用 () 分组。
HAVING
像 WHERE 子句一样工作,但它在 SELECT 子句中声明的聚合后应用。因此,我们可以在这里应用聚合函数的结果条件。
ORDER BY
指定排序结果集的表达式。
LIMIT BY/LIMIT/OFFSET
不言而喻,他们使用整数和 Clickhouse 相应的值设置在查询中。如果查询未指定 limit 或 offset,它们将分别默认为 1000 和 0。
GRANULARITY
一个整数表示根据时间结果分组的粒度。
TOTALS
若设置为 True,来自 Snuba 会有一个 “totals” key,包括所有选定行的总值。
SAMPLE
如果 MATCH 如果子句中的节点未提供采样率,则可在此指定。在这种情况下,Snuba 会将 sample right 分配给查询中的节点之一。sample 可以是 0 和 1 之间的浮点数,表示采样行的百分比。
或者可以是大于 1 的整数,表示采样行数。