INSERT INTO tick VALUES
('2019-02-18 10:55:36.179760', 'ABC', 100.00),
('2019-02-18 10:55:26.179760', 'ABC', 100.00),
('2019-02-18 10:55:16.179760', 'ABC', 100.00),
('2019-02-18 10:55:06.179760', 'ABC', 100.00),
('2019-02-18 10:55:06.179760', 'ABC', 100.00),
('2019-02-18 10:55:06.179760', 'YJM', 100.00),
('2019-02-18 10:55:01.179760', 'XYZ', 100.00);
此查询使用标准SQL 窗口函数为表中的每个符号生成高,低,打开和关闭值,假设“ticks”包含最近交易日的数据。

参考粘贴用例:
WITH ranked AS
(SELECT symbol,
RANK() OVER w as r,
MIN(price) OVER w as min_pr,
MAX(price) OVER w as max_pr,
FIRST_VALUE(price) OVER w as first,
LAST_VALUE(price) OVER w as last
FROM tick
WINDOW w AS (PARTITION BY symbol
ORDER BY ts
ROWS BETWEEN UNBOUNDED PREDING
AND UNBOUNDED FOLLOWING))
SELECT symbol, min_pr, max_por, first, last
FROM ranked
WHERE r = 1;
类似的查询可用于创建“烛台图表”,这是一种流行的金融时间序列报表样式,如下图所示,可显示连续时间间隔内证券的开盘价,最高价,最低价和收盘价:
例如,该查询生成一个表,该表可以在三分钟的时间间隔内直接转换为烛台图表:
Results:
结果:
平滑是时间序列管理的另一个常见需求。这个查询为股票“ABC”生成一个平滑的价格序列,平均最后三个记录的价格:
Results:
结果:
MemSQL支持用户定义的标量函数(UDF),聚合函数和存储过程(MPSQL语言)的可扩展性。MemSQL将UDF和存储过程编译为机器代码,以获得高性能。实际上,我使用了可扩展性来创建上一节中用作UDF 的time_bucket()函数(如下面的附录所示); 这为其他特定时间序列产品中的类似功能提供了相同的功能。您可以很容易地创建一个函数或表达式来按时间间隔存储,例如秒、分钟、小时或天。时间序列数据的一个常见需求是执行插值。
例如,假设有一个时间序列,其中随机间隔的点平均间隔为30秒。可能有几分钟没有数据点。因此,如果您将原始(不规则)时间序列数据转换为具有一分钟点的常规时间序列,则可能存在间隙。如果要为没有间隙的绘图提供输出,则需要从间隙前后的值中插入间隙的值。在MemSQL中实现存储过程非常简单,方法是获取一个查询结果,并输出一个行集,其中的空格插入到一个临时表中。
然后可以使用ECHO命令将其发送回客户端应用程序。此外,MemSQL支持用户定义的聚合函数,这些函数可用于实现有用的时间序列操作,例如获取序列中第一个和最后一个值的简写,而无需特定的窗口函数。根据一个名为FIRST()的用户定义的聚合函数(UDAF),考虑此查询以在每三分钟的交易中获得股票ABC的第一个值:

参考粘贴用例:
SELECT time_bucket('3 minte', ts), first(price, ts)
FROM tick WHERE symbol = "ABC"
GROUP BY 1
ORDER BY 1;
FIRST()和类似的LAST() UDAF的实现在下面的补充材料部分中给出。
MemSQL擅长处理时间序列事件的突发插入流量和节省空间很重要的历史时间序列信息。对于突发插入流量,您可以使用MemSQL行存储表来保存时间序列事件。对于较大和较长生命周期的时间序列事件集或已经老化的较老的时间序列数据集(因此不再更新它们),MemSQLcolumnstore是一种很好的格式,因为它可以非常有效地压缩时间序列数据。此外,它保存在磁盘上,因此主内存大小不限制您可以存储的数据量。
构建时间序列应用程序时,数据可以有许多来源,包括应用程序,文件系统,S3,HDFS,Azure Blob商店和Kafka队列。MemSQL可以从所有这些来源快速地获取数据。MemSQL Pipelines专门用于快速轻松地从这些源加载数据流,无需过程编码即可在MemSQL中建立快速的事件流。MemSQL可以以惊人的数据速率提取数据。在最近的一次测试中,我使用了一个双节点MemSQL集群,每个节点在Intel Xeon Platinum 28核系统上运行,每秒直接从应用程序插入2,850,500个事件,具有完整的事务完整性和持久性。可以使用直接加载或Kafka管道获得更好的速率。如果你必须扩展更高,只需添加更多节点 - 没有实际限制。
我们已经看到,时间序列数据管理市场已经分化为时间序列专用产品,使用它们自己的专用语言;以及可以与使用SQL的标准报告和业务智能工具互操作的扩展SQL系统。MemSQL属于第二类。MemSQL适用于需要快速查询,低延迟查询和高并发性的时间序列应用程序,没有扩展限制,并且受益于SQL语言功能和SQL工具连接。
许多特定于时间序列的产品在数据管理方面都有缺陷。有些应用程序缺乏扩展功能,限制了它们可以处理的问题的大小,或者迫使应用程序开发人员在代码中构建复杂的分片逻辑,以便在多个实例之间分割数据,这将耗费宝贵的人力资源,而这些人力资源可以更好地投入到应用程序业务逻辑中。其他系统的解释查询处理器无法跟上我们这样的最新查询执行实现。有些缺少SQL数据库常见的事务处理完整性功能。MemSQL让时间序列应用程序开发人员充满信心地前进,他们知道自己不会遇到规模瓶颈,并且可以使用所有熟悉的工具——任何可以连接到SQL数据库的工具。
MemSQL是一个用于管理时间序列数据的强大平台。它支持快速方便地加载事件流的能力,并且可以无限扩展。它支持完整的SQL,可以使用SQL 92的所有标准功能,以及添加的窗口函数扩展来实现复杂的查询。它支持许多开发人员对各种应用程序(包括时间序列)所需的事务,高速并发更新和查询以及高可用性技术。而且,您最喜欢的SQL兼容工具可以连接到MemSQL,这使得MemSQL成为时间序列的强大平台。