Q语言 - 属性(Attributes)

优质
小牛编辑
127浏览
2023-12-01

表的列表,词典或列可以应用属性。 属性在列表中强加某些属性。 某些属性可能会在修改时消失。

属性类型

Sorted (`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

排序的属性将在未排序的附加时丢失。

Parted (`p#)

`p#表示列表已分开,相同的项目是连续存储的。

范围是具有基础int值的inttemporal type ,例如年,月,日等。如果符号被枚举,您还可以对符号进行分区。

应用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

Note −

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

  • 当实体数量达到十亿并且大多数分区具有相当大的尺寸时,应该考虑分开的属性,即,存在显着的重复。

Grouped (`g#)

`g#表示列表已分组。 构建并维护内部字典,将每个唯一项映射到其每个索引,这需要相当大的存储空间。 对于包含大小为s唯一项的长度L的列表,这将是(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

Unique (`#u)

将唯一属性(`u#)应用于列表表示列表中的项是不同的。 知道列表的元素是唯一的,可以大大加快速度,并允许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

Note −

  • `u#保留在连接上,保留了唯一性。 它在删除和非唯一连接时丢失。

  • 搜索`u#列表是通过哈希函数完成的。

删除属性

可以通过应用`#来删除属性。

应用属性

应用属性的三种格式是 -

  • L: `s# 14 2 3 3 9 /在列表创建期间指定

  • @[ `.; `L ; `s#] @[ `.; `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#).