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