
- KDB+ 教程
- KDB+ - 首頁
- Q 程式語言
- Q 程式語言
- Q 語言 - 型別轉換
- Q 語言 - 時間資料
- Q 語言 - 列表
- Q 語言 - 索引
- Q 語言 - 字典
- Q 語言 - 表格
- Q 語言 - 動詞 & 副詞
- Q 語言 - 連線
- Q 語言 - 函式
- Q 語言 - 內建函式
- Q 語言 - 查詢
- Q - 程序間通訊
- Q - 訊息處理器 (.Z 庫)
- KDB+ 有用資源
- KDB+ - 快速指南
- KDB+ - 有用資源
- KDB+ - 討論
Q 語言 - 表格
表格是 kdb+ 的核心。表格是由命名列組成的集合,實現為字典。q 表格是列向的。
建立表格
使用以下語法建立表格:
q)trade:([]time:();sym:();price:();size:()) q)trade time sym price size -------------------
在上面的例子中,我們沒有指定每一列的型別。這將由第一次插入到表格中的資料設定。
另一種方法,我們可以在初始化時指定列型別:
q)trade:([]time:`time$();sym:`$();price:`float$();size:`int$())
或者我們也可以定義非空表格:
q)trade:([]sym:(`a`b);price:(1 2)) q)trade sym price ------------- a 1 b 2
如果方括號內沒有列,如上例所示,則表格為無鍵表格。
要建立一個鍵表,我們將鍵列插入到方括號中。
q)trade:([sym:`$()]time:`time$();price:`float$();size:`int$()) q)trade sym | time price size ----- | ---------------
也可以透過將值設定為各種型別的空列表來定義列型別:
q)trade:([]time:0#0Nt;sym:0#`;price:0#0n;size:0#0N)
獲取表格資訊
讓我們建立一個交易表:
trade: ([]sym:`ibm`msft`apple`samsung;mcap:2000 4000 9000 6000;ex:`nasdaq`nasdaq`DAX`Dow) q)cols trade / column names of a table `sym`mcap`ex q)trade.sym / Retrieves the value of column sym `ibm`msft`apple`samsung q)show meta trade / Get the meta data of a table trade. c | t f a ----- | ----- Sym | s Mcap | j ex | s
主鍵和鍵表
鍵表
鍵表是一個字典,它將唯一鍵表中每一行的值對映到值表中對應的行。讓我們來看一個例子:
val:flip `name`id!(`John`Jenny`Jonathan;9 18 27) / a flip dictionary create table val id:flip (enlist `eid)!enlist 99 198 297 / flip dictionary, having single column eid
現在建立一個包含 eid 作為鍵的簡單鍵表:
q)valid: id ! val q)valid / table name valid, having key as eid eid | name id ------| --------------- 99 | John 9 198 | Jenny 18 297 | Jonathan 27
外部索引鍵
外部索引鍵定義了從定義它的表的行到具有相應主鍵的表的行的對映。
外部索引鍵提供引用完整性。換句話說,嘗試插入主鍵中不存在的外部索引鍵值將失敗。
考慮以下示例。在第一個示例中,我們將在初始化時顯式定義外部索引鍵。在第二個示例中,我們將使用外部索引鍵追溯,它不假設兩個表之間存在任何先驗關係。
示例 1 - 初始化時定義外部索引鍵
q)sector:([sym:`SAMSUNG`HSBC`JPMC`APPLE]ex:`N`CME`DAQ`N;MC:1000 2000 3000 4000) q)tab:([]sym:`sector$`HSBC`APPLE`APPLE`APPLE`HSBC`JPMC;price:6?9f) q)show meta tab c | t f a ------ | ---------- sym | s sector price | f q)show select from tab where sym.ex=`N sym price ---------------- APPLE 4.65382 APPLE 4.643817 APPLE 3.659978
示例 2 - 表之間沒有預定義的關係
sector: ([symb:`IBM`MSFT`HSBC]ex:`N`CME`N;MC:1000 2000 3000) tab:([]sym:`IBM`MSFT`MSFT`HSBC`HSBC;price:5?9f)
要使用外部索引鍵追溯,我們必須建立一個表來鍵入 sector。
q)show update mc:(sector([]symb:sym))[`MC] from tab sym price mc -------------------------- IBM 7.065297 1000 MSFT 4.812387 2000 MSFT 6.400545 2000 HSBC 3.704373 3000 HSBC 4.438651 3000
預定義外部索引鍵的一般表示法:
select a.b from c 其中 a 是外部索引鍵 (sym),b 是
主鍵表中的欄位 (ind),c 是
外部索引鍵表 (trade)
操作表格
讓我們建立一個交易表並檢查不同表格表示式的結果:
q)trade:([]sym:5?`ibm`msft`hsbc`samsung;price:5?(303.00*3+1);size:5?(900*5);time:5?(.z.T-365)) q)trade sym price size time ----------------------------------------- msft 743.8592 3162 02:32:17.036 msft 641.7307 2917 01:44:56.936 hsbc 838.2311 1492 00:25:23.210 samsung 278.3498 1983 00:29:38.945 ibm 838.6471 4006 07:24:26.842
現在讓我們看一下使用q語言操作表格的語句。
選擇
使用選擇語句的語法如下:
select [columns] [by columns] from table [where clause]
現在讓我們來看一個例子來演示如何使用選擇語句:
q)/ select expression example q)select sym,price,size by time from trade where size > 2000 time | sym price size ------------- | ----------------------- 01:44:56.936 | msft 641.7307 2917 02:32:17.036 | msft 743.8592 3162 07:24:26.842 | ibm 838.6471 4006
插入
使用插入語句的語法如下:
`tablename insert (values) Insert[`tablename; values]
現在讓我們來看一個例子來演示如何使用插入語句:
q)/ Insert expression example q)`trade insert (`hsbc`apple;302.0 730.40;3020 3012;09:30:17.00409:15:00.000) 5 6 q)trade sym price size time ------------------------------------------ msft 743.8592 3162 02:32:17.036 msft 641.7307 2917 01:44:56.936 hsbc 838.2311 1492 00:25:23.210 samsung 278.3498 1983 00:29:38.945 ibm 838.6471 4006 07:24:26.842 hsbc 302 3020 09:30:17.004 apple 730.4 3012 09:15:00.000 q)/Insert another value q)insert[`trade;(`samsung;302.0; 3333;10:30:00.000] '] q)insert[`trade;(`samsung;302.0; 3333;10:30:00.000)] ,7 q)trade sym price size time ---------------------------------------- msft 743.8592 3162 02:32:17.036 msft 641.7307 2917 01:44:56.936 hsbc 838.2311 1492 00:25:23.210 samsung 278.3498 1983 00:29:38.945 ibm 838.6471 4006 07:24:26.842 hsbc 302 3020 09:30:17.004 apple 730.4 3012 09:15:00.000 samsung 302 3333 10:30:00.000
刪除
使用刪除語句的語法如下:
delete columns from table delete from table where clause
現在讓我們來看一個例子來演示如何使用刪除語句:
q)/Delete expression example q)delete price from trade sym size time ------------------------------- msft 3162 02:32:17.036 msft 2917 01:44:56.936 hsbc 1492 00:25:23.210 samsung 1983 00:29:38.945 ibm 4006 07:24:26.842 hsbc 3020 09:30:17.004 apple 3012 09:15:00.000 samsung 3333 10:30:00.000 q)delete from trade where price > 3000 sym price size time ------------------------------------------- msft 743.8592 3162 02:32:17.036 msft 641.7307 2917 01:44:56.936 hsbc 838.2311 1492 00:25:23.210 samsung 278.3498 1983 00:29:38.945 ibm 838.6471 4006 07:24:26.842 hsbc 302 3020 09:30:17.004 apple 730.4 3012 09:15:00.000 samsung 302 3333 10:30:00.000 q)delete from trade where price > 500 sym price size time ----------------------------------------- samsung 278.3498 1983 00:29:38.945 hsbc 302 3020 09:30:17.004 samsung 302 3333 10:30:00.000
更新
使用更新語句的語法如下:
update column: newValue from table where ….
使用以下語法使用 cast 函式更新列的格式/資料型別:
update column:newValue from `table where …
現在讓我們來看一個例子來演示如何使用更新語句:
q)/Update expression example q)update size:9000 from trade where price > 600 sym price size time ------------------------------------------ msft 743.8592 9000 02:32:17.036 msft 641.7307 9000 01:44:56.936 hsbc 838.2311 9000 00:25:23.210 samsung 278.3498 1983 00:29:38.945 ibm 838.6471 9000 07:24:26.842 hsbc 302 3020 09:30:17.004 apple 730.4 9000 09:15:00.000 samsung 302 3333 10:30:00.000 q)/Update the datatype of a column using the cast function q)meta trade c | t f a ----- | -------- sym | s price| f size | j time | t q)update size:`float$size from trade sym price size time ------------------------------------------ msft 743.8592 3162 02:32:17.036 msft 641.7307 2917 01:44:56.936 hsbc 838.2311 1492 00:25:23.210 samsung 278.3498 1983 00:29:38.945 ibm 838.6471 4006 07:24:26.842 hsbc 302 3020 09:30:17.004 apple 730.4 3012 09:15:00.000 samsung 302 3333 10:30:00.000 q)/ Above statement will not update the size column datatype permanently q)meta trade c | t f a ------ | -------- sym | s price | f size | j time | t q)/to make changes in the trade table permanently, we have do q)update size:`float$size from `trade `trade q)meta trade c | t f a ------ | -------- sym | s price | f size | f time | t