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#).
廣告