使用嵌套字典在kdb + TSDB表上选择查询

use*_*903 2 database tags dictionary time-series kdb

为了存储按kdb + TSDB中的标签分组的基于时间的数据,我创建了一个包含列的表timestamp,valtags.标签是键值对,因此我使用字典在列中存储此类信息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)

任何帮助表示赞赏.

MdS*_*lih 8

要访问字典中的元素,您需要在深度处进行索引 - 在这种情况下需要处理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每行中的字典不是同类的(相同的键+值的相同类型),则可能会'typetags字典缺少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()副词.有关副词的详细信息,请参见此处.

  • 您可以在每行中添加一个sentinel值,其中所有预期键的值都设置为相应类型的空值,但这会不必要地增加内存和磁盘空间使用量.此外,如果空值在tge数据中有意义,则可能不合适.如果你不想使用匹配运算符,要处理行可能没有标记的情况,你可以在`select`中添加一个附加子句,在字典检查之前检查值的类型,以确保它是字典/或在使用空字典的情况下确保字典中至少有1个条目. (2认同)