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# 表示列表是分开的,相同的项目是连续存储的。

范围是一个 int时间类型,具有基础 int 值,例如年、月、日等。您还可以对枚举的符号进行分区。

应用parted属性会创建一个索引字典,将每个唯一的输出值映射到其第一次出现的位置。 当列表被分割时,查找速度要快得多,因为线性搜索被哈希表查找取代。

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

注意 −

  • 在列表上的操作下,parted 属性不会被保留,即使该操作保留了分区。

  • 当实体数量达到十亿并且大多数分区都很大,即存在大量重复时,应考虑parted属性。

分组 (`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# 属性

  • 从 `tab 更新 `s#time

    / 更新表格(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#).