use*_*903 2 database tags dictionary time-series kdb
为了存储按kdb + TSDB中的标签分组的基于时间的数据,我创建了一个包含列的表timestamp
,val
和tags
.标签是键值对,因此我使用字典在列中存储此类信息tags
.
查询创建表:
myTable:([]timestamp:-12h$();val:-9h$();tags:());
Run Code Online (Sandbox Code Playgroud)
查询插入一些示例数据:
`myTable insert ("P"$"2015-11-30 13:10:45.126381"; 521.45117; `house`room!215 111)
Run Code Online (Sandbox Code Playgroud)
如何获得房屋215的所有数据/行?我尝试了以下查询但没有成功(类型错误):
select from myTable where tags[`house]=215
Run Code Online (Sandbox Code Playgroud)
任何帮助表示赞赏.
要访问字典中的元素,您需要在深度处进行索引 - 在这种情况下需要处理2级嵌套.外部索引是行计数,内部索引是字典键.
在q中,要在深度(elide)处索引,省略其中一个索引级别,在这种特定情况下,查询将是:
q) select from myTable where tags[;`house]=215
timestamp val tags
----------------------------------------------------------
2015.11.30D13:10:45.126381000 521.4512 `house`room!215 111
Run Code Online (Sandbox Code Playgroud)
注意事项:如果tags
每行中的字典不是同类的(相同的键+值的相同类型),则可能会'type
在tags
字典缺少house
键的行中引发错误,因为Kdb +将返回空值,这可能不是是预期的类型.因此,可能需要使用匹配运算符(〜).
例如:
q) select from myTable where tags[;`house]~\:215
timestamp val tags
----------------------------------------------------------
2015.11.30D13:10:45.126381000 521.4512 `house`room!215 111
Run Code Online (Sandbox Code Playgroud)
注意,\:
这里使用了each-left()副词.有关副词的详细信息,请参见此处.