- KDB+ 教程
- KDB+ - 首页
- Q 编程语言
- Q 编程语言
- Q 语言 - 类型转换
- Q 语言 - 时间数据
- Q 语言 - 列表
- Q 语言 - 索引
- Q 语言 - 字典
- Q 语言 - 表格
- Q 语言 - 动词 & 副词
- Q 语言 - 连接
- Q 语言 - 函数
- Q 语言 - 内置函数
- Q 语言 - 查询
- Q - 进程间通信
- Q - 消息处理器 (.Z 库)
- KDB+ 有用资源
- KDB+ - 快速指南
- KDB+ - 有用资源
- KDB+ - 讨论
Q 语言 - 属性
列表、字典或表格的列可以应用属性。属性对列表施加某些属性。某些属性在修改时可能会消失。
属性类型
已排序 (`s#)
`s# 表示列表按升序排序。如果列表由 asc(或 xasc)显式排序,则列表将自动设置已排序属性。
q)L1: asc 40 30 20 50 9 4 q)L1 `s#4 9 20 30 40 50
已知已排序的列表也可以显式设置属性。Q 将检查列表是否已排序,如果不是,则会抛出s-fail错误。
q)L2:30 40 24 30 2 q)`s#L2 's-fail
在未排序的追加操作后,将丢失已排序属性。
已分区 (`p#)
`p# 表示列表已分区,并且相同的项目连续存储。
范围是具有底层整数值的整数或时间类型,例如年、月、日等。您也可以对枚举的符号进行分区。
应用已分区属性会创建一个索引字典,该字典将每个唯一的输出值映射到其第一次出现的位 置。当列表已分区时,查找速度会快得多,因为线性搜索被哈希表查找所取代。
q)L:`p# 99 88 77 1 2 3 q)L `p#99 88 77 1 2 3 q)L,:3 q)L 99 88 77 1 2 3 3
注意 −
即使操作保留了分区,已分区属性也不会在列表上的操作下保留。
当实体数量达到十亿并且大部分分区都相当大时,即存在大量重复时,应考虑已分区属性。
已分组 (`g#)
`g# 表示列表已分组。将构建和维护一个内部字典,该字典将每个唯一项目映射到其每个索引,需要大量的存储空间。对于长度为L、包含u个大小为s的唯一项目的列表,这将为(L × 4) + (u × s) 字节。
当无法对列表的结构做出其他假设时,可以将分组应用于列表。
该属性可以应用于任何类型的列表。它在追加时保持不变,但在删除时丢失。
q)L: `g# 1 2 3 4 5 4 2 3 1 4 5 6 q)L `g#1 2 3 4 5 4 2 3 1 4 5 6 q)L,:9 q)L `g#1 2 3 4 5 4 2 3 1 4 5 6 9 q)L _:2 q)L 1 2 4 5 4 2 3 1 4 5 6 9
唯一 (`#u)
将唯一属性 (`u#) 应用于列表表示列表的项目是不同的。知道列表的元素是唯一的极大地加快了distinct 的速度,并允许q 尽早执行一些比较。
当列表被标记为唯一时,会为列表中的每个项目创建一个内部哈希映射。列表上的操作必须保留唯一性,否则属性将丢失。
q)LU:`u#`MSFT`SAMSUNG`APPLE q)LU `u#`MSFT`SAMSUNG`APPLE q)LU,:`IBM /Uniqueness preserved q)LU `u#`MSFT`SAMSUNG`APPLE`IBM q)LU,:`SAMSUNG / Attribute lost q)LU `MSFT`SAMSUNG`APPLE`IBM`SAMSUNG
注意 −
`u# 保留在线性连接保留唯一性的情况下。在删除和非唯一连接时会丢失。
对 `u# 列表的搜索通过哈希函数完成。
删除属性
可以通过应用 `# 来删除属性。
应用属性
应用属性的三种格式为:
L: `s# 14 2 3 3 9/ 在列表创建期间指定
@[ `.; `L ; `s#]/ 函数式应用,即应用于变量列表 L
/ 在默认命名空间 (即 `.) 中应用
/ 已排序 `s# 属性
Update `s#time from `tab
/ 更新表格 (tab) 以应用
/ 属性。
让我们用示例应用上述三种不同的格式。
q)/ set the attribute during creation q)L:`s# 3 4 9 10 23 84 90 q)/apply the attribute to existing list data q)L1: 9 18 27 36 42 54 q)@[`.;`L1;`s#] `. q)L1 / check `s#9 18 27 36 42 54 q)@[`.;`L1;`#] / clear attribute `. q)L1 9 18 27 36 42 54 q)/update a table to apply the attribute q)t: ([] sym:`ibm`msft`samsung; mcap:9000 18000 27000) q)t:([]time:09:00 09:30 10:00t;sym:`ibm`msft`samsung; mcap:9000 18000 27000) q)t time sym mcap --------------------------------- 09:00:00.000 ibm 9000 09:30:00.000 msft 18000 10:00:00.000 samsung 27000 q)update `s#time from `t `t q)meta t / check it was applied c | t f a ------ | ----- time | t s sym | s mcap | j Above we can see that the attribute column in meta table results shows the time column is sorted (`s#).