KDB + - Hızlı Kılavuz

Bu tam bir alıntıdır kdb+kx sistemlerinden, öncelikle bağımsız öğrenenlere yönelik. 2003 yılında tanıtılan kdb +, verileri yakalamak, analiz etmek, karşılaştırmak ve depolamak için tasarlanmış yeni nesil kdb veri tabanıdır.

Bir kdb + sistemi aşağıdaki iki bileşeni içerir -

  • KDB+ - veritabanı (k veritabanı artı)

  • Q - kdb + ile çalışmak için programlama dili

Her ikisi de kdb+ ve q yazılmıştır k programming language (ile aynı q ancak daha az okunabilir).

Arka fon

Kdb + / q, belirsiz bir akademik dil olarak ortaya çıktı, ancak yıllar geçtikçe, kullanıcı dostu olma özelliğini giderek geliştirdi.

  • APL (1964, Bir Programlama Dili)

  • A+ (1988, APL, Arthur Whitney tarafından değiştirildi)

  • K (1993, A + 'nın net versiyonu, A. Whitney tarafından geliştirilmiştir)

  • Kdb (1998, bellek içi sütun tabanlı db)

  • Kdb+/q (2003, q dili - k'nin daha okunaklı versiyonu)

KDB + Neden ve Nerede Kullanılır?

Neden? - Analitik ile gerçek zamanlı veriler için tek bir çözüme ihtiyacınız varsa, kdb + 'yı düşünmelisiniz. Kdb +, veritabanını sıradan yerel dosyalar olarak depolar, bu nedenle donanım ve depolama mimarisiyle ilgili herhangi bir özel gereksinimi yoktur. Veritabanının sadece bir dizi dosya olduğuna dikkat çekmek önemlidir, bu nedenle yönetim işleriniz zor olmayacaktır.

KDB + nerede kullanılır??- Çoğu şu anda kullandığı veya geleneksel veritabanlarından kdb + 'ya geçmeyi planladığı için, hangi yatırım bankalarının kdb + kullanmadığını hesaplamak kolaydır. Veri hacmi gün geçtikçe arttığından, büyük hacimli verileri işleyebilecek bir sisteme ihtiyacımız var. KDB + bu gereksinimi karşılar. KDB + sadece muazzam miktarda veri depolamakla kalmaz, aynı zamanda gerçek zamanlı olarak analiz eder.

Başlangıç

Bu kadar arka planla, şimdi KDB + için nasıl bir ortam kuracağımızı öğrenelim ve öğrenelim. KDB + 'nın nasıl indirilip kurulacağıyla başlayacağız.

KDB + İndirme ve Yükleme

64 bit sürümün tüm işlevselliği ile KDB + 'nın ücretsiz 32 bit sürümünü aşağıdaki adresten edinebilirsiniz: http://kx.com/software-download.php

Lisans sözleşmesini kabul edin, işletim sistemini seçin (tüm ana işletim sistemleri için mevcuttur). Windows işletim sistemi için en son sürüm 3.2'dir. En son sürümü indirin. Bir kez açtığınızda, klasör adını alacaksınız“windows” ve Windows klasörünün içinde başka bir klasör alacaksınız “q”. Tamamını kopyalaq klasörünüzü c: / sürücünüze yerleştirin.

Çalıştırma terminalini açın, sakladığınız konumu yazın. qKlasör; "c: /q/w32/q.exe" gibi olacaktır. Enter tuşuna bastığınızda, aşağıdaki gibi yeni bir konsol alacaksınız -

İlk satırda 3.2 olan sürüm numarasını ve 2015.03.05 olarak çıkış tarihini görebilirsiniz.

Dizin Düzeni

Deneme sürümü / ücretsiz sürüm genellikle dizinlere kurulur,

For linux/Mac −

~/q       / main q directory (under the user’s home)
~/q/l32   / location of linux 32-bit executable
~/q/m32   / Location of mac 32-bit executable

For Windows −

c:/q          / Main q directory
c:/q/w32/     / Location of windows 32-bit executable

Example Files −

Kdb + 'yı indirdikten sonra, Windows platformundaki dizin yapısı aşağıdaki gibi görünecektir -

Yukarıdaki dizin yapısında, trade.q ve sp.q referans noktası olarak kullanabileceğimiz örnek dosyalardır.

Kdb +, en başından itibaren muazzam hacimlerde veriyi işlemek için tasarlanmış yüksek performanslı, yüksek hacimli bir veritabanıdır. Tamamen 64 bittir ve yerleşik çok çekirdekli işleme ve çok iş parçacıklıdır. Aynı mimari gerçek zamanlı ve geçmiş veriler için kullanılır. Veritabanı, kendi güçlü sorgu dilini içerir,q, böylece analitik doğrudan veriler üzerinde çalıştırılabilir.

kdb+tick gerçek zamanlı ve geçmiş verilerin yakalanmasına, işlenmesine ve sorgulanmasına izin veren bir mimaridir.

Kdb + / tick Mimarisi

Aşağıdaki çizim, tipik bir Kdb + / tick mimarisinin genel bir taslağını ve ardından çeşitli bileşenlerin kısa bir açıklamasını ve veri akışını sağlar.

  • Data Feeds çoğunlukla Reuters, Bloomberg gibi veri akışı sağlayıcıları tarafından veya doğrudan borsalardan sağlanan bir zaman serisi verileridir.

  • İlgili verileri elde etmek için, veri feed'indeki veriler şu şekilde ayrıştırılır: feed handler.

  • Veriler, besleme işleyicisi tarafından ayrıştırıldıktan sonra, ticker-plant.

  • Herhangi bir hatadan verileri kurtarmak için, ticker-plant önce yeni verileri günlük dosyasına günceller / depolar ve ardından kendi tablolarını günceller.

  • Dahili tabloları ve günlük dosyalarını güncelledikten sonra, on-time döngü verileri sürekli olarak gerçek zamanlı veri tabanına ve veri talep eden tüm zincirlenmiş abonelere gönderilir / yayınlanır.

  • Bir iş gününün sonunda, günlük dosyası silinir, yenisi oluşturulur ve gerçek zamanlı veri tabanı geçmiş veri tabanına kaydedilir. Tüm veriler geçmiş veritabanına kaydedildikten sonra, gerçek zamanlı veritabanı tablolarını temizler.

Kdb + Tick Mimarisinin Bileşenleri

Veri Beslemeleri

Veri Beslemeleri, herhangi bir pazar veya diğer zaman serisi verileri olabilir. Veri akışlarını, besleme işleyicisinin ham girdisi olarak düşünün. Beslemeler, doğrudan borsadan (canlı akış verileri), Thomson-Reuters, Bloomberg gibi haber / veri sağlayıcılardan veya diğer herhangi bir harici kurumdan alınabilir.

Yem İşleyici

Bir besleme işleyicisi, veri akışını kdb + 'ya yazmaya uygun bir biçime dönüştürür. Veri beslemesine bağlıdır ve beslemeye özgü formattaki verileri alır ve ticker-plant işlemine yayınlanan bir Kdb + mesajına dönüştürür. Aşağıdaki işlemleri gerçekleştirmek için genellikle bir besleme işleyici kullanılır -

  • Verileri bir dizi kurala göre yakalayın.
  • Bu verileri bir formattan diğerine çevirin (/ zenginleştirin).
  • En yeni değerleri yakalayın.

Ticker Plant

Ticker Plant, KDB + mimarisinin en önemli bileşenidir. Finansal verilere erişmek için gerçek zamanlı veri tabanının veya doğrudan abonelerin (müşterilerin) bağlandığı ticker bitkisidir. Faaliyet göstermektedirpublish and subscribemekanizma. Bir abonelik (lisans) edindiğinizde, yayıncıdan (kayan yazı tesisi) bir onay (rutin olarak) yayını tanımlanır. Aşağıdaki işlemleri gerçekleştirir -

  • Verileri besleme işleyicisinden alır.

  • Kayan tesis veriyi aldıktan hemen sonra, bir kopyasını bir günlük dosyası olarak saklar ve kama tesisi herhangi bir güncelleme aldığında onu günceller, böylece herhangi bir arıza durumunda herhangi bir veri kaybı yaşamamalıyız.

  • Müşteriler (gerçek zamanlı abone), ticker-plant'a doğrudan abone olabilir.

  • Her iş gününün sonunda, yani gerçek zamanlı veri tabanı son mesajı aldığında, bugünün tüm verilerini geçmiş veri tabanına depolar ve aynısını bugünün verilerine abone olan tüm abonelere gönderir. Sonra tüm tablolarını sıfırlar. Günlük dosyası, veriler tarihsel veritabanında veya gerçek zamanlı veritabanına (rtdb) doğrudan bağlı diğer abonelerde depolandığında da silinir.

  • Sonuç olarak, ticker-plant, gerçek zamanlı veri tabanı ve tarihsel veri tabanı 24/7 esasına göre çalışır.

Ticker-plant bir Kdb + uygulaması olduğundan, tabloları kullanılarak sorgulanabilir qdiğer Kdb + veritabanları gibi. Tüm ticker-plant müşterileri veri tabanına sadece abone olarak erişebilmelidir.

Gerçek Zamanlı Veritabanı

Gerçek zamanlı veritabanı (RDB) bugünün verilerini depolar. Doğrudan ticker bitkisine bağlıdır. Tipik olarak, piyasa saatlerinde (bir gün) bellekte depolanır ve günün sonunda tarihsel veritabanına (hdb) yazılır. Veriler (rdb verileri) bellekte depolandığından, işlem son derece hızlıdır.

Kdb +, günlük beklenen veri boyutunun dört veya daha fazla katı RAM boyutuna sahip olmayı önerdiğinden, rdb üzerinde çalışan sorgu çok hızlıdır ve üstün performans sağlar. Gerçek zamanlı bir veritabanı yalnızca bugünün verilerini içerdiğinden, tarih sütunu (parametresi) gerekli değildir.

Örneğin, aşağıdaki gibi rdb sorgularımız olabilir:

select from trade where sym = `ibm

OR

select from trade where sym = `ibm, price > 100

Tarihsel Veritabanı

Bir şirketin tahminlerini hesaplamamız gerekirse, geçmiş verilerini hazır bulundurmamız gerekir. Geçmiş veritabanı (hdb) geçmişte yapılan işlemlerin verilerini tutar. Her yeni günün rekoru gün sonunda hdb'ye eklenecekti. Hdb'deki büyük tablolar ya yatay olarak depolanır (her sütun kendi dosyasında saklanır) ya da geçici verilerle bölümlenmiş olarak depolanır. Ayrıca bazı çok büyük veritabanları kullanılarak daha da bölümlere ayrılabilir.par.txt (dosya).

Bu depolama stratejileri (bölünmüş, bölümlenmiş, vb.), Büyük bir tablodaki verileri ararken veya bunlara erişirken etkilidir.

Bir tarihsel veritabanı, dahili ve harici raporlama amaçları için, yani analitik için de kullanılabilir. Örneğin, belirli bir gün için IBM'in şirket alım satımlarını ticaret (veya herhangi bir) tablo adından almak istediğimizi varsayalım, aşağıdaki gibi bir sorgu yazmamız gerekir -

thisday: 2014.10.12

select from trade where date = thisday, sym =`ibm

Note - Tüm bu tür sorguları, q dil.

Kdb + olarak bilinen yerleşik programlama diliyle birlikte gelir q. Zaman serileri analizi için genişletilen ve standart sürüme göre birçok avantaj sunan bir standart SQL üst kümesini içerir. SQL'e aşina olan herkes öğrenebilirq birkaç gün içinde kendi geçici sorgularını hızlıca yazabilir.

"Q" Ortamını Başlatma

Kdb + kullanmaya başlamak için, qoturum, toplantı, celse. Başlamanın üç yolu vardır.q oturum -

  • Çalıştırma terminalinize “c: /q/w32/q.exe” yazmanız yeterlidir.

  • MS-DOS komut terminalini başlatın ve yazın q.

  • Kopyala q.exe "C: \ Windows \ System32" dosyasına ve çalıştırma terminaline "q" yazmanız yeterlidir.

Burada bir Windows platformu üzerinde çalıştığınızı varsayıyoruz.

Veri tipleri

Aşağıdaki tablo, desteklenen veri türlerinin bir listesini sağlar -

İsim Misal Char Tür Boyut
Boole 1b b 1 1
bayt 0xff x 4 1
kısa 23 saat h 5 2
int 23i ben 6 4
uzun 23j j 7 8
gerçek 2.3e e 8 4
yüzen 2.3f f 9 8
kömür "A" c 10 1
Varchar `ab s 11 *
ay 2003.03 milyon m 13 4
tarih 2015.03.17T18: 01: 40.134 z 15 8
dakika 08:31 sen 17 4
ikinci 08:31:53 v 18 4
zaman 18: 03: 18.521 t 19 4
Sıralama `u $` b, burada u: `a`b * 20 4

Atom ve Liste Oluşumu

Atomlar tekli varlıklardır, örneğin tek bir sayı, bir karakter veya bir sembol. Yukarıdaki tabloda (farklı veri türlerinde), desteklenen tüm veri türleri atomlardır. Liste, bir atom dizisidir veya listeler dahil diğer türlerdir.

Monadik (yani tek bağımsız değişken işlevi) türdeki işleve herhangi bir türden bir atom geçirmek, negatif bir değer döndürür, yani, –n, bu atomların basit bir listesini type işlevine geçirmek pozitif bir değer döndürür n.

Örnek 1 - Atom ve Liste Oluşumu

/ Note that the comments begin with a slash “ / ” and cause the parser
/ to ignore everything up to the end of the line.

x: `mohan              / `mohan is a symbol, assigned to a variable x
type x                 / let’s check the type of x
-11h                   / -ve sign, because it’s single element.

y: (`abc;`bca;`cab)    / list of three symbols, y is the variable name.

type y
11h                    / +ve sign, as it contain list of atoms (symbol).

y1: (`abc`bca`cab)     / another way of writing y, please note NO semicolon

y2: (`$”symbols may have interior blanks”)   / string to symbol conversion
y[0]                   / return `abc
y 0                    / same as y[0], also returns `abc
y 0 2                  / returns `abc`cab, same as does y[0 2]

z: (`abc; 10 20 30; (`a`b); 9.9 8.8 7.7)      / List of different types,
z 2 0                  / returns (`a`b; `abc),
z[2;0]                 / return `a. first element of z[2]

x: “Hello World!”      / list of character, a string
x 4 0                  / returns “oH” i.e. 4th and 0th(first)
element

Genellikle bazı verilerin veri türünü bir türden diğerine değiştirmek gerekir. Standart çevrim işlevi "$" dırdyadic operator.

Bir türden diğerine çevirmek için üç yaklaşım kullanılır (dizge hariç) -

  • İstenen veri türünü sembol adına göre belirtin
  • İstenilen veri türünü karakterine göre belirtin
  • Kısa değeri ile istenen veri tipini belirtin.

Tamsayıları Kayanlara Çevirme

Aşağıdaki tam sayıları float'lara çevirme örneğinde, üç farklı çevrim yönteminin tümü eşdeğerdir -

q)a:9 18 27

q)$[`float;a]     / Specify desired data type by its symbol name, 1st way
9 18 27f

q)$["f";a]        / Specify desired data type by its character, 2nd way
9 18 27f

q)$[9h;a]         / Specify desired data type by its short value, 3rd way
9 18 27f

Üç işlemin de eşdeğer olup olmadığını kontrol edin,

q)($[`float;a]~$["f";a]) and ($[`float;a] ~ $[9h;a])
1b

Dizeleri Sembollere Çevirme

Dizeyi sembollere çevirmek ve bunun tersi biraz farklı çalışır. Bir örnekle kontrol edelim -

q)b: ("Hello";"World";"HelloWorld")    / define a list of strings

q)b
"Hello"
"World"
"HelloWorld"

q)c: `$b                               / this is how to cast strings to symbols

q)c                                    / Now c is a list of symbols
`Hello`World`HelloWorld

'Sembolü veya 11h' anahtar kelimelerini kullanarak dizeleri sembollere çevirmeye çalışmak, tür hatasıyla başarısız olur -

q)b
"Hello"
"World"
"HelloWorld"

q)`symbol$b
'type

q)11h$b
'type

Dizeleri Sembol Olmayanlara Çevirme

Dizeleri simgeden başka bir veri türüne çevirmek şu şekilde gerçekleştirilir -

q)b:900               / b contain single atomic integer

q)c:string b          / convert this integer atom to string “900”

q)c
"900"

q)`int $ c            / converting string to integer will return the
                      / ASCII equivalent of the character “9”, “0” and
                      / “0” to produce the list of integer 57, 48 and
                      / 48.
57 48 48i

q)6h $ c / Same as above 57 48 48i q)"i" $ c             / Same a above
57 48 48i

q)"I" $ c
900i

Dolayısıyla, tüm bir dizeyi (karakter listesi) tek bir veri türü atomuna çevirmek için x veri türünü temsil eden büyük harfi belirtmemizi gerektirir x ilk argüman olarak $Şebeke. Veri türünü belirtirsenizx başka herhangi bir şekilde, dizinin her karakterine atamanın uygulanmasıyla sonuçlanır.

q dil, zaman ve tarihler gibi zamansal verileri temsil etmek ve işlemek için birçok farklı yola sahiptir.

Tarih

Kdb + cinsinden bir tarih, referans tarihimiz 01Ocak2000 olduğundan bu yana günlerin tam sayısı olarak dahili olarak depolanır. Bu tarihten sonraki bir tarih dahili olarak pozitif bir sayı olarak depolanır ve ondan önceki bir tarih negatif sayı olarak anılır.

Varsayılan olarak, "YYYY.MM.DD" biçiminde bir tarih yazılır

q)x:2015.01.22      / This is how we write 22nd Jan 2015

q)`int$x / Number of days since 2000.01.01 5500i q)`year$x           / Extracting year from the date
2015i

q)x.year            / Another way of extracting year
2015i

q)`mm$x / Extracting month from the date 1i q)x.mm / Another way of extracting month 1i q)`dd$x             / Extracting day from the date
22i

q)x.dd              / Another way of extracting day
22i

Arithmetic and logical operations doğrudan tarihlerde gerçekleştirilebilir.

q)x+1        / Add one day
2015.01.23

q)x-7        / Subtract 7 days
2015.01.15

1 Ocak 2000 Cumartesi günü düştü. Bu nedenle, tarih boyunca veya gelecekte 7'ye bölündüğünde herhangi bir Cumartesi, 0'ın kalanını, Pazar 1'i, Pazartesi getirisi 2'yi verir.

Day               mod 7
           Saturday              0
           Sunday                1
           Monday                2
           Tuesday               3
           Wednesday             4
           Thursday              5
           Friday                6

Zamanlar

Bir saat, gece yarısının vuruşundan bu yana geçen tam sayı milisaniye olarak dahili olarak depolanır. HH: MM: SS.MSS biçiminde bir saat yazılır.

q)tt1: 03:30:00.000     / tt1 store the time 03:30 AM

q)tt1
03:30:00.000

q)`int$tt1 / Number of milliseconds in 3.5 hours 12600000i q)`hh$tt1               / Extract the hour component from time
3i

q)tt1.hh
3i

q)`mm$tt1 / Extract the minute component from time 30i q)tt1.mm 30i q)`ss$tt1               / Extract the second component from time
0i

q)tt1.ss
0i

Tarihlerde olduğu gibi, aritmetik doğrudan saatler üzerinde gerçekleştirilebilir.

Veri zamanları

Tarih saat, ISO standart biçiminde olduğu gibi 'T' ile ayrılmış bir tarih ve saatin birleşimidir. Bir tarih saat değeri, 1 Ocak 2000 gece yarısından itibaren kesirli gün sayısını depolar.

q)dt:2012.12.20T04:54:59:000      / 04:54.59 AM on 20thDec2012

q)type dt
-15h

q)dt
2012.12.20T04:54:59.000
9
q)`float$dt
4737.205

Temel kesirli gün sayısı float'a dönüştürülerek elde edilebilir.

Listeler, temel yapı taşlarıdır q language, bu yüzden listelerin tam olarak anlaşılması çok önemlidir. Bir liste basitçe atomların (atomik elementler) ve diğer listelerin (bir veya daha fazla atom grubu) sıralı bir koleksiyonudur.

Liste Türleri

Bir general listöğelerini eşleşen parantezler içine alır ve bunları noktalı virgüllerle ayırır. Örneğin -

(9;8;7)   or   ("a"; "b"; "c")   or   (-10.0; 3.1415e; `abcd; "r")

Bir liste aynı türden atomlardan oluşuyorsa, bu uniform list. Aksi takdirde, birgeneral list (karışık tip).

Miktar

Bir listedeki öğelerin sayısını onun sayımıyla elde edebiliriz.

q)l1:(-10.0;3.1415e;`abcd;"r")    / Assigning variable name to general list

q)count l1                        / Calculating number of items in the list l1
4

Basit Liste Örnekleri

q)h:(1h;2h;255h)                    / Simple Integer List

q)h
1 2 255h

q)f:(123.4567;9876.543;98.7)        / Simple Floating Point List

q)f
123.4567 9876.543 98.7

q)b:(0b;1b;0b;1b;1b)                / Simple Binary Lists

q)b
01011b

q)symbols:(`Life;`Is;`Beautiful)    / Simple Symbols List

q)symbols
`Life`Is`Beautiful

q)chars:("h";"e";"l";"l";"o";" ";"w";"o";"r";"l";"d") 
                                    / Simple char lists and Strings.
q)chars
"hello world"

**Note − A simple list of char is called a string.

Bir liste atomları veya listeleri içerir. To create a single item list, kullanırız -

q)singleton:enlist 42

q)singleton
,42

To distinguish between an atom and the equivalent singleton, türlerinin işaretini inceleyin.

q)signum type 42
-1i

q)signum type enlist 42
1i

Bir liste, öğelerinin konumuna göre soldan sağa doğru sıralanır. Bir öğenin listenin başından olan uzaklığına onunindex. Böylece, ilk öğenin indeksi 0, ikinci öğenin (varsa) indeksi 1, vb. Bir sayım listesin dizin etki alanına sahip 0 -e n–1.

Dizin gösterimi

Bir liste verildi L, dizindeki öğe i tarafından erişilir L[i]. Bir öğeyi indeksine göre geri çağırmaya deniritem indexing. Örneğin,

q)L:(99;98.7e;`b;`abc;"z")

q)L[0]
99

q)L[1]
98.7e

q)L[4]
"z

Dizine Alınmış Atama

Bir listedeki öğeler, öğe indeksleme yoluyla da atanabilir. Böylece,

q)L1:9 8 7

q)L1[2]:66      / Indexed assignment into a simple list
                / enforces strict type matching.
                
q)L1
9 8 66

Değişkenlerden Listeler

q)l1:(9;8;40;200)

q)l2:(1 4 3; `abc`xyz)

q)l:(l1;l2)               / combining the two list l1 and l2

q)l
9 8 40 200
(1 4 3;`abc`xyz)

Listelere Katılma

İki listedeki en yaygın işlem, daha büyük bir liste oluşturmak için bunları bir araya getirmektir. Daha doğrusu, birleştirme operatörü (,) sağ işlenenini sol işlenenin sonuna ekler ve sonucu döndürür. Her iki argümanda da bir atomu kabul eder.

q)1,2 3 4
1 2 3 4

q)1 2 3, 4.4 5.6     / If the arguments are not of uniform type,
                     / the result is a general list.
1
2
3
4.4
5.6

Yuvalama

Veri karmaşıklığı, listeleri liste öğeleri olarak kullanarak oluşturulur.

Derinlik

Bir liste için iç içe geçme düzeylerinin sayısına derinlik denir. Atomların derinliği 0 ve basit listelerin derinliği 1'dir.

q)l1:(9;8;(99;88))

q)count l1
3

İşte iki öğeye sahip derinlik 3'ün bir listesi -

q)l5
9
(90;180;900 1800 2700 3600)

q)count l5
2

q)count l5[1]
3

Derinlikte Endeksleme

İç içe geçmiş bir listenin öğelerini doğrudan indekslemek mümkündür.

Repeated Item Indexing

Bir öğeyi tek bir dizin yoluyla almak, her zaman iç içe geçmiş bir listeden en üstteki öğeyi getirir.

q)L:(1;(100;200;(300;400;500;600)))

q)L[0]
1

q)L[1]
100
200
300 400 500 600

Sonuçtan beri L[1] kendisi bir listedir, elemanlarını tek bir indeks kullanarak alabiliriz.

q)L[1][2]
300 400 500 600

En içteki iç içe geçmiş listeden bir öğeyi almak için tek indekslemeyi bir kez daha tekrarlayabiliriz.

q)L[1][2][0]
300

Bunu şu şekilde okuyabilirsiniz:

1. dizindeki öğeyi L'den alın ve ondan 2. dizindeki öğeyi alın ve ondan 0. dizindeki öğeyi geri alın.

Notation for Indexing at Depth

İç içe geçmiş bir listenin bileşenlerine tekrarlanan indeksleme için alternatif bir gösterim vardır. Son geri çağırma şu şekilde de yazılabilir:

q)L[1;2;0]
300

İndeks yoluyla atama da derinlemesine çalışır.

q)L[1;2;1]:900

q)L
1
(100;200;300 900 500 600)

Elided Endeksler

Eliding Indices for a General List

q)L:((1 2 3; 4 5 6 7); (`a`b`c;`d`e`f`g;`0`1`2);("good";"morning"))

q)L
(1 2 3;4 5 6 7)
(`a`b`c;`d`e`f`g;`0`1`2)
("good";"morning")

q)L[;1;]
4 5 6 7
`d`e`f`g
"morning"

q)L[;;2]
3 6
`c`f`2
"or"

Interpret L[;1;] as,

Üst düzeydeki her listenin ikinci konumundaki tüm öğeleri alın.

Interpret L[;;2] as,

İkinci seviyedeki her liste için üçüncü pozisyondaki öğeleri alın.

Sözlükler, tablo oluşturmak için temel sağlayan listelerin bir uzantısıdır. Matematiksel terimlerle sözlük,

"Alan → Aralık"

veya genel olarak (kısa) oluşturur

"Anahtar → değer"

elemanlar arasındaki ilişki.

Sözlük, kabaca bir karma tabloya eşdeğer olan anahtar-değer çiftlerinin sıralı bir koleksiyonudur. Sözlük, bir alan listesi ile bir aralık listesi arasında konumsal yazışma yoluyla açık bir I / O ilişkisi tarafından tanımlanan bir eşlemedir. Bir sözlüğün oluşturulması, "xkey" ilkel (!)

ListOfDomain ! ListOfRange

En temel sözlük, basit bir listeyi basit bir listeye eşler.

Giriş (I) Çıkış (O)
İsim John
`Yaş 36
Seks "M"
Ağırlık 60.3
q)d:`Name`Age`Sex`Weight!(`John;36;"M";60.3)   / Create a dictionary d

q)d

Name   | `John
Age    | 36
Sex    | "M"
Weight | 60.3

q)count d             / To get the number of rows in a dictionary.
4

q)key d               / The function key returns the domain
`Name`Age`Sex`Weight

q)value d             / The function value returns the range.

`John
36

"M"
60.3

q)cols d             / The function cols also returns the domain.
`Name`Age`Sex`Weight

Yukarı Bak

Bir giriş değerine karşılık gelen sözlük çıktı değerinin bulunması denir looking up girdi.

q)d[`Name]       / Accessing the value of domain `Name
`John

q)d[`Name`Sex]   / extended item-wise to a simple list of keys
`John
"M"

Verb @ ile arama

q)d1:`one`two`three!9 18 27

q)d1[`two]
18

q)d1@`two
18

Sözlüklerde İşlemler

Düzeltme ve Yükseltme

Listelerde olduğu gibi, bir sözlüğün öğeleri de dizinlenmiş atama yoluyla değiştirilebilir.

d:`Name`Age`Sex`Weight! (`John;36;"M";60.3)
                                  / A dictionary d
                                  
q)d[`Age]:35                      / Assigning new value to key Age

q)d 
                              / New value assigned to key Age in d
Name   | `John
Age    | 35
Sex    | "M"
Weight | 60.3

Sözlükler, dizin ataması yoluyla genişletilebilir.

q)d[`Height]:"182 Ft"

q)d

Name   | `John
Age    | 35
Sex    | "M"
Weight | 60.3
Height | "182 Ft"

Bul (?) İle Geriye Doğru Arama

Bul (?) Operatörü, bir dizi öğeyi etki alanı öğesine eşleyerek geriye doğru arama gerçekleştirmek için kullanılır.

q)d2:`x`y`z!99 88 77

q)d2?77
`z

Bir listenin unsurlarının benzersiz olmaması durumunda, find alan listesinden ilk öğe eşlemesini ona döndürür.

Girişleri Kaldırma

Bir girişi sözlükten kaldırmak için, delete ( _ ) functionkullanıldı. Sol işlenen (_) sözlüktür ve sağ işlenen bir anahtar değeridir.

q)d2:`x`y`z!99 88 77

q)d2 _`z

x| 99
y| 88

İlk işlenen bir değişkense, _ karakterinin solunda boşluk olması gerekir.

q)`x`y _ d2           / Deleting multiple entries

z| 77

Sütun Sözlükleri

Sütun sözlükleri, tablo oluşturmanın temelidir. Şu örneği düşünün -

q)scores: `name`id!(`John`Jenny`Jonathan;9 18 27)
                              / Dictionary scores
                              
q)scores[`name]               / The values for the name column are
`John`Jenny`Jonathan

q)scores.name                 / Retrieving the values for a column in a
                              / column dictionary using dot notation.
`John`Jenny`Jonathan

q)scores[`name][1]            / Values in row 1 of the name column
`Jenny

q)scores[`id][2]              / Values in row 2 of the id column is
27

Sözlüğü Çevirmek

Bir sütun sözlüğünü çevirmenin net etkisi, indislerin sırasını tersine çevirmektir. Bu mantıksal olarak satırların ve sütunların yer değiştirmesine eşdeğerdir.

Sütun Sözlüğünde Çevirme

Bir sözlüğün devri, tekli çevirme operatörü uygulanarak elde edilir. Aşağıdaki örneğe bir göz atın -

q)scores

name  | John Jenny Jonathan
id    | 9   18   27

q)flip scores

  name     id
---------------
  John     9
  Jenny    18
 Jonathan  27

Çevrilmiş Sütun Sözlüğünün Çevirilmesi

Bir sözlüğü iki kez transpoze ederseniz, orijinal sözlüğü elde edersiniz,

q)scores ~ flip flip scores
1b

Tablolar kdb + 'nın kalbindedir. Tablo, bir sözlük olarak uygulanan adlandırılmış sütunların bir koleksiyonudur.q tables sütun odaklıdır.

Tablolar Oluşturma

Tablolar aşağıdaki sözdizimi kullanılarak oluşturulur -

q)trade:([]time:();sym:();price:();size:())

q)trade
time sym price size
-------------------

Yukarıdaki örnekte, her bir sütunun türünü belirtmedik. Bu, tablonun ilk ekinde belirlenecektir.

Başka bir şekilde, başlangıçta sütun türünü belirtebiliriz -

q)trade:([]time:`time$();sym:`$();price:`float$();size:`int$())

Veya boş olmayan tablolar da tanımlayabiliriz -

q)trade:([]sym:(`a`b);price:(1 2))

q)trade

 sym   price
-------------
  a      1
  b      2

Yukarıdaki örneklerde olduğu gibi köşeli parantez içinde sütun yoksa, tablo unkeyed.

Oluşturmak için keyed table, köşeli parantez içindeki anahtar için sütun (lar) ı ekliyoruz.

q)trade:([sym:`$()]time:`time$();price:`float$();size:`int$())

q)trade

 sym   | time price size
-----  | ---------------

Biri, değerleri çeşitli türlerin boş listeleri olarak ayarlayarak da sütun türlerini tanımlayabilir -

q)trade:([]time:0#0Nt;sym:0#`;price:0#0n;size:0#0N)

Tablo Bilgilerini Alma

Bir ticaret tablosu oluşturalım -

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

Birincil Anahtarlar ve Anahtarlı Tablolar

Anahtarlı Tablo

Anahtarlı bir tablo, benzersiz anahtarlar tablosundaki her satırı, değerler tablosundaki karşılık gelen bir satırla eşleyen bir sözlüktür. Bir örnek alalım -

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

Şimdi anahtar olarak bayram içeren basit bir anahtarlı tablo oluşturun,

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

Yabancı anahtarlar

Bir foreign key içinde tanımlandığı tablonun satırlarından karşılık gelen tablonun satırlarına bir eşlemeyi tanımlar. primary key.

Yabancı anahtarlar sağlar referential integrity. Başka bir deyişle, birincil anahtarda olmayan bir yabancı anahtar değeri ekleme girişimi başarısız olur.

Aşağıdaki örnekleri düşünün. İlk örnekte, başlangıçta açıkça bir yabancı anahtar tanımlayacağız. İkinci örnekte, iki tablo arasında önceden herhangi bir ilişki olduğunu varsaymayan yabancı anahtar takibi kullanacağız.

Example 1 − Define foreign key on initialization

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

Example 2 − no pre-defined relationship between tables

sector: ([symb:`IBM`MSFT`HSBC]ex:`N`CME`N;MC:1000 2000 3000)
tab:([]sym:`IBM`MSFT`MSFT`HSBC`HSBC;price:5?9f)

Yabancı anahtar kovalamayı kullanmak için, sektöre girmek için bir tablo oluşturmalıyız.

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

Önceden tanımlanmış bir yabancı anahtar için genel gösterim -

a'nın yabancı anahtar (sym) olduğu c'den ab'yi seçin, b, a'dır

birincil anahtar tablosundaki (ind) alanı, c

yabancı anahtar tablosu (ticaret)

Tabloları Düzenleme

Bir ticaret tablosu oluşturalım ve farklı tablo ifadesinin sonucunu kontrol edelim -

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

Şimdi tabloları değiştirmek için kullanılan ifadelere bir göz atalım. q dil.

Seçiniz

Kullanılacak sözdizimi Select ifade aşağıdaki gibidir -

select [columns] [by columns] from table [where clause]

Şimdi Select ifadesinin nasıl kullanılacağını göstermek için bir örnek alalım -

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

Ekle

Kullanılacak sözdizimi Insert ifade aşağıdaki gibidir -

`tablename insert (values)
Insert[`tablename; values]

Şimdi, Insert ifadesinin nasıl kullanılacağını göstermek için bir örnek alalım -

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

Sil

Kullanılacak sözdizimi Delete ifade aşağıdaki gibidir -

delete columns from table
delete from table where clause

Şimdi Delete ifadesinin nasıl kullanılacağını göstermek için bir örnek alalım -

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

Güncelleme

Kullanılacak sözdizimi Update ifade aşağıdaki gibidir -

update column: newValue from table where ….

Cast işlevini kullanarak bir sütunun formatını / veri türünü güncellemek için aşağıdaki sözdizimini kullanın -

update column:newValue from `table where …

Şimdi nasıl kullanılacağını göstermek için bir örnek alalım Update ifade -

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

Kdb + isimler, fiiller ve zarflara sahiptir. Tüm veri nesneleri ve işlevlerinouns. Verbs ifadelerdeki köşeli parantez ve parantez sayısını azaltarak okunabilirliği artırın. Adverbsyeni, ilişkili fiiller üretmek için ikili (2 bağımsız değişken) işlevleri ve fiilleri değiştirin. Zarfların ürettiği işlevlerederived functions veya derived verbs.

Her biri

Zarf each(`) ile gösterilen, ikili işlevleri ve fiilleri, listelerin kendileri yerine listelerin öğelerine uygulanacak şekilde değiştirir. Aşağıdaki örneğe bir göz atın -

q)1, (2 3 5)       / Join
1 2 3 5

q)1, '( 2 3 4)     / Join each
1 2
1 3
1 4

Bir formu var Each"each" anahtar sözcüğünü kullanan monadik işlevler için. Örneğin,

q)reverse ( 1 2 3; "abc")           /Reverse
a b c
1 2 3

q)each [reverse] (1 2 3; "abc")     /Reverse-Each
3 2 1
c b a

q)'[reverse] ( 1 2 3; "abc")
3 2 1
c b a

Her Sol ve Her Sağ

İkili fonksiyonlar için Herbirinin iki çeşidi vardır: Each-Left (\:) ve Each-Right(/ :). Aşağıdaki örnek bunların nasıl kullanılacağını açıklamaktadır.

q)x: 9 18 27 36

q)y:10 20 30 40

q)x,y            / join
9 18 27 36 10 20 30 40

q)x,'y           / each

9   10
18  20
27  30
36  40

q)x: 9 18 27 36

q)y:10 20 30 40

q)x,y            / join
9 18 27 36 10 20 30 40

q)x,'y           / each, will return a list of pairs

9   10
18  20
27  30
36  40

q)x, \:y         / each left, returns a list of each element
                 / from x with all of y
					  
9   10  20  30  40
18  10  20  30  40
27  10  20  30  40
36  10  20  30  40

q)x,/:y          / each right, returns a list of all the x with
                 / each element of y
					  
9  18  27  36  10
9  18  27  36  20
9  18  27  36  30
9  18  27  36  40

q)1 _x           / drop the first element
18 27 36

q)-2_y           / drop the last two element
10 20

q)               / Combine each left and each right to be a
                 / cross-product (cartesian product)
                 
q)x,/:\:y

9   10  9   20  9   30  9   40
18  10  18  20  18  30  18  40
27  10  27  20  27  30  27  40
36  10  36  20  36  30  36  40

İçinde qdil, sağlanan giriş tablolarına ve arzu ettiğimiz birleştirilmiş tablo türlerine göre farklı türde birleştirmelerimiz var. Bir birleşim, iki tablodaki verileri birleştirir. Yabancı anahtar takibinin yanı sıra, masalara katılmanın dört yolu daha var -

  • Basit birleştirme
  • Asof katılma
  • Sol yönden katılım
  • Sendika katılımı

Burada, bu bölümde, bu birleşimlerin her birini ayrıntılı olarak tartışacağız.

Basit Birleştirme

Basit birleştirme, virgül ',' ile gerçekleştirilen en temel birleştirme türüdür. Bu durumda, iki tablonuntype conformantyani, her iki tablo da aynı sırada aynı sayıda sütuna ve aynı anahtara sahiptir.

table1,:table2 / table1 is assigned the value of table2

Aynı uzunluktaki tabloların yana doğru birleştirilmesi için virgül kullanabiliriz. Tablolardan biri burada anahtarlanabilir,

Table1, `Table2

Asof Join (aj)

Bir tablodaki bir alanın değerini, başka bir tablodaki zamana göre almak için kullanılan en güçlü birleştirmedir. Genellikle, her işlem sırasında geçerli teklifi almak ve talep etmek için kullanılır.

Genel format

aj[joinColumns;tbl1;tbl2]

Örneğin,

aj[`sym`time;trade;quote]

Misal

q)tab1:([]a:(1 2 3 4);b:(2 3 4 5);d:(6 7 8 9))

q)tab2:([]a:(2 3 4);b:(3 4 5); c:( 4 5 6))

q)show aj[`a`b;tab1;tab2]

 a  b  d  c
-------------
 1  2  6
 2  3  7  4
 3  4  8  5
 4  5  9  6

Sol Birleştirme (lj)

Bu, ikinci bağımsız değişkenin anahtarlı bir tablo olduğu ve ilk bağımsız değişkenin, doğru bağımsız değişkenin anahtarının sütunlarını içerdiği özel bir aj durumu.

Genel format

table1 lj Keyed-table

Misal

q)/Left join- syntax table1 lj table2 or lj[table1;table2]

q)tab1:([]a:(1 2 3 4);b:(2 3 4 5);d:(6 7 8 9))

q)tab2:([a:(2 3 4);b:(3 4 5)]; c:( 4 5 6))

q)show lj[tab1;tab2]

 a  b  d  c
-------------
 1  2  6
 2  3  7  4
 3  4  8  5
 4  5  9  6

Birliğe Katılma (uj)

Farklı şemalara sahip iki tablonun birleşimini oluşturmaya izin verir. Temelde basit birleştirmenin bir uzantısıdır (,)

q)tab1:([]a:(1 2 3 4);b:(2 3 4 5);d:(6 7 8 9))

q)tab2:([]a:(2 3 4);b:(3 4 5); c:( 4 5 6))

q)show uj[tab1;tab2]

 a  b  d  c
------------
 1  2  6
 2  3  7
 3  4  8
 4  5  9
 2  3     4
 3  4     5
 4  5     6

Anahtarlı tablolarda uj kullanıyorsanız, birincil anahtarların eşleşmesi gerekir.

Fonksiyon Türleri

Fonksiyonlar birkaç şekilde sınıflandırılabilir. Burada onları aldıkları argüman sayısına ve türüne ve sonuç türüne göre sınıflandırdık. Fonksiyonlar olabilir,

  • Atomic - Argümanların atomik olduğu ve atomik sonuçlar ürettiği yerler

  • Aggregate - listeden atom

  • Uniform (list from list)- Listelere uygulandıkları için atom kavramı genişletildi. Bağımsız değişken listesinin sayısı, sonuç listesinin sayısına eşittir.

  • Other - işlev yukarıdaki kategoride değilse.

Matematikte ikili işlemler denir dyadic functionsq'da; örneğin, "+". Benzer şekilde tekli işlemler denirmonadic functions; örneğin, "abs" veya "zemin".

Sık Kullanılan Fonksiyonlar

Sıklıkla kullanılan birkaç işlev vardır. qprogramlama. Burada, bu bölümde, bazı popüler işlevlerin kullanımını göreceğiz -

abs

q) abs -9.9 / Absolute value, Negates -ve number & leaves non -ve number
9.9

herşey

q) all 4 5 0 -4 / Logical AND (numeric min), returns the minimum value
0b

Maks (&), Min (|) ve Değil (!)

q) /And, Or, and Logical Negation

q) 1b & 1b        / And (Max)
1b

q) 1b|0b              / Or (Min)
1b

q) not 1b             /Logical Negate (Not)
0b

yükselmek

q)asc 1 3 5 7 -2 0 4    / Order list ascending, sorted list
                        / in ascending order i
s returned
`s#-2 0 1 3 4 5 7

q)/attr - gives the attributes of data, which describe how it's sorted.
`s denotes fully sorted, `u denotes unique and `p and `g are used to 
refer to lists with repetition, with `p standing for parted and `g for grouped

ort.

q)avg 3 4 5 6 7           / Return average of a list of numeric values
5f

q)/Create on trade table

q)trade:([]time:3?(.z.Z-200);sym:3?(`ibm`msft`apple);price:3?99.0;size:3?100)

tarafından

q)/ by - Groups rows in a table at given sym

q)select sum price by sym from trade    / find total price for each sym

  sym  |   price
------ | --------
 apple | 140.2165
  ibm  | 16.11385

cols

q)cols trade / Lists columns of a table
`time`sym`price`size

Miktar

q)count (til 9) / Count list, count the elements in a list and
                / return a single int value 9

Liman

q)\p 9999 / assign port number

q)/csv - This command allows queries in a browser to be exported to
   excel by prefixing the query, such as http://localhost:9999/.csv?select from trade where sym =`ibm

kesmek

q)/ cut - Allows a table or list to be cut at a certain point

q)(1 3 5) cut "abcdefghijkl"
                            / the argument is split at 1st, 3rd and 5th letter.
"bc"
"de"
"fghijkl"

q)5 cut "abcdefghijkl"      / cut the right arg. Into 5 letters part
                            / until its end.
"abcde"
"fghij"
"kl"

Sil

q)/delete - Delete rows/columns from a table

q)delete price from trade

          time              sym   size
---------------------------------------
  2009.06.18T06:04:42.919  apple   36
  2009.11.14T12:42:34.653   ibm    12
  2009.12.27T17:02:11.518  apple   97

Farklı

q)/distinct - Returns the distinct element of a list

q)distinct 1 2 3 2 3 4 5 2 1 3            / generate unique set of number
1 2 3 4 5

askere almak

q)/enlist - Creates one-item list.

q)enlist 37
,37

q)type 37           / -ve type value
-7h

q)type enlist 37    / +ve type value
7h

Doldur (^)

q)/fill - used with nulls. There are three functions for processing null values.

The dyadic function named fill replaces null values in the right argument with the atomic left argument.

q)100 ^ 3 4 0N 0N -5
3 4 100 100 -5

q)`Hello^`jack`herry``john`
`jack`herry`Hello`john`Hello

Dolgular

q)/fills - fills in nulls with the previous not null value.

q)fills 1 0N 2 0N 0N 2 3 0N -5 0N
1 1 2 2 2 2 3 3 -5 -5

İlk

q)/first - returns the first atom of a list

q)first 1 3 34 5 3
1

Çevir

q)/flip - Monadic primitive that applies to lists and associations. It interchange the top two levels of its argument.

q)trade

       time                   sym      price   size
------------------------------------------------------
  2009.06.18T06:04:42.919    apple   72.05742   36
  2009.11.14T12:42:34.653    ibm     16.11385   12
  2009.12.27T17:02:11.518    apple   68.15909   97

q)flip trade

time | 2009.06.18T06:04:42.919 2009.11.14T12:42:34.653
2009.12.27T17:02:11.518

sym   |  apple         ibm         apple
price | 72.05742     16.11385    68.15909
size  | 36 12 97

Iasc

q)/iasc - Index ascending, return the indices of the ascended sorted list relative to the input list.

q)iasc 5 4 0 3 4 9

2 3 1 4 0 5

Idesc

q)/idesc - Index desceding, return the descended sorted list relative to the input list

q)idesc 0 1 3 4

3 2 1 0

içinde

q)/in - In a list, dyadic function used to query list (on the right-handside) about their contents.

q)(2 4) in 1 2 3

10b

eklemek

q)/insert - Insert statement, upload new data into a table.

q)insert[`trade;((.z.Z);`samsung;48.35;99)],3

q)trade

      time                  sym       price     size
------------------------------------------------------
 2009.06.18T06:04:42.919   apple    72.05742     36
 2009.11.14T12:42:34.653    ibm     16.11385     12
 2009.12.27T17:02:11.518   apple    68.15909     97
 2015.04.06T10:03:36.738   samsung  48.35        99

anahtar

q)/key - three different functions i.e. generate +ve integer number, gives content of a directory or key of a table/dictionary.

q)key 9

0 1 2 3 4 5 6 7 8

q)key `:c:
`$RECYCLE.BIN`Config.Msi`Documents and Settings`Drivers`Geojit`hiberfil.sys`I..

aşağı

q)/lower - Convert to lower case and floor

q)lower ("JoHn";`HERRY`SYM)
"john"
`herry`sym

Maks ve Min (yani | ve &)

q)/Max and Min / a|b and a&b

q)9|7
9

q)9&5
5

boş

q)/null - return 1b if the atom is a null else 0b from the argument list

q)null 1 3 3 0N
0001b

şeftali

q)/peach - Parallel each, allows process across slaves

q)foo peach list1       / function foo applied across the slaves named in list1

'list1

q)foo:{x+27}

q)list1:(0 1 2 3 4)

q)foo peach list1       / function foo applied across the slaves named in list1
27 28 29 30 31

Önceki

q)/prev - returns the previous element i.e. pushes list forwards

q)prev 0 1 3 4 5 7

0N 0 1 3 4 5

Rastgele (?)

q)/random - syntax - n?list, gives random sequences of ints and floats

q)9?5
0 0 4 0 3 2 2 0 1

q)3?9.9
0.2426823 1.674133 3.901671

Parçala

q)/raze - Flattn a list of lists, removes a layer of indexing from a list of lists. for instance:

q)raze (( 12 3 4; 30 0);("hello";7 8); 1 3 4)

12 3 4
30 0
"hello"
7 8
1
3
4

oku0

q)/read0 - Read in a text file

q)read0 `:c:/q/README.txt    / gives the contents of *.txt file

oku1

q)/read1 - Read in a q data file

q)read1 `:c:/q/t1

0xff016200630b000500000073796d0074696d6500707269636…

tersine çevirmek

q)/reverse - Reverse a list

q)reverse 2 30 29 1 3 4

4 3 1 29 30 2

q)reverse "HelloWorld"

"dlroWolleH"

Ayarlamak

q)/set - set value of a variable

q)`x set 9
`x

q)x
9

q)`:c:/q/test12 set trade

`:c:/q/test12

q)get `:c:/q/test12

       time                   sym      price     size
---------------------------------------------------------
  2009.06.18T06:04:42.919    apple    72.05742    36
  2009.11.14T12:42:34.653     ibm     16.11385    12
  2009.12.27T17:02:11.518    apple    68.15909    97
  2015.04.06T10:03:36.738    samsung  48.35       99
  2015.04.06T10:03:47.540    samsung  48.35       99
  2015.04.06T10:04:44.844    samsung  48.35       99

ssr

q)/ssr - String search and replace, syntax - ssr["string";searchstring;replaced-with]

q)ssr["HelloWorld";"o";"O"]

"HellOWOrld"

dizi

q)/string - converts to string, converts all types to a string format.

q)string (1 2 3; `abc;"XYZ";0b)

(,"1";,"2";,"3")
"abc"

(,"X";,"Y";,"Z")
,"0"

SV

q)/sv - Scalar from vector, performs different tasks dependent on its arguments.

It evaluates the base representation of numbers, which allows us to calculate the number of seconds in a month or convert a length from feet and inches to centimeters.

q)24 60 60 sv 11 30 49

41449   / number of seconds elapsed in a day at 11:30:49

sistemi

q)/system - allows a system command to be sent,

q)system "dir *.py"

" Volume in drive C is New Volume"
" Volume Serial Number is 8CD2-05B2"
""

" Directory of C:\\Users\\myaccount-raj"
""

"09/14/2014    06:32 PM     22 hello1.py"
"                1 File(s)    22 bytes"

tablolar

q)/tables - list all tables

q)tables `

`s#`tab1`tab2`trade

Til

q)/til - Enumerate

q)til 5

0 1 2 3 4

kırpmak

q)/trim - Eliminate string spaces

q)trim " John "

"John"

vs

q)/vs - Vector from scaler , produces a vector quantity from a scaler quantity

q)"|" vs "20150204|msft|20.45"

"20150204"
"msft"
"20.45"

xasc

q)/xasc - Order table ascending, allows a table (right-hand argument) to be sorted such that (left-hand argument) is in ascending order

q)`price xasc trade

          time                 sym      price      size
----------------------------------------------------------
   2009.11.14T12:42:34.653     ibm     16.11385     12
   2015.04.06T10:03:36.738   samsung   48.35        99
   2015.04.06T10:03:47.540   samsung   48.35        99
   2015.04.06T10:04:44.844   samsung   48.35        99
   2009.12.27T17:02:11.518    apple    68.15909     97
   2009.06.18T06:04:42.919    apple    72.05742     36

xcol

q)/xcol - Renames columns of a table

q)`timeNew`symNew xcol trade

        timeNew                 symNew    price      size
-------------------------------------------------------------
   2009.06.18T06:04:42.919      apple    72.05742     36
   2009.11.14T12:42:34.653       ibm     16.11385     12
   2009.12.27T17:02:11.518      apple    68.15909     97
   2015.04.06T10:03:36.738     samsung   48.35        99
   2015.04.06T10:03:47.540     samsung   48.35        99
   2015.04.06T10:04:44.844     samsung   48.35        99

xcols

q)/xcols - Reorders the columns of a table,

q)`size`price xcols trade

  size    price           time                   sym
-----------------------------------------------------------
   36   72.05742   2009.06.18T06:04:42.919      apple 
   12   16.11385   2009.11.14T12:42:34.653       ibm
   97   68.15909   2009.12.27T17:02:11.518      apple
   99   48.35      2015.04.06T10:03:36.738     samsung 
   99   48.35      2015.04.06T10:03:47.540     samsung
   99   48.35      2015.04.06T10:04:44.844     samsung

xdesc

q)/xdesc - Order table descending, allows tables to be sorted such that the left-hand argument is in descending order.

q)`price xdesc trade

        time                   sym       price      size
-----------------------------------------------------------
   2009.06.18T06:04:42.919    apple    72.05742      36
   2009.12.27T17:02:11.518    apple    68.15909      97
   2015.04.06T10:03:36.738   samsung   48.35         99
   2015.04.06T10:03:47.540   samsung   48.35         99
   2015.04.06T10:04:44.844   samsung   48.35         99
   2009.11.14T12:42:34.653     ibm     16.11385      12

xgroup

q)/xgroup - Creates nested table

q)`x xgroup ([]x:9 18 9 18 27 9 9;y:10 20 10 20 30 40)
'length

q)`x xgroup ([]x:9 18 9 18 27 9 9;y:10 20 10 20 30 40 10)

  x  |    y
---- | -----------
  9  | 10 10 40 10
  18 | 20 20
  27 | ,30

xkey

q)/xkey - Set key on table

q)`sym xkey trade

    sym   |      time                    price     size
--------- | -----------------------------------------------
   apple  | 2009.06.18T06:04:42.919    72.05742     36
    ibm   | 2009.11.14T12:42:34.653    16.11385     12
   apple  | 2009.12.27T17:02:11.518    68.15909     97
  samsung | 2015.04.06T10:03:36.738    48.35        99
  samsung | 2015.04.06T10:03:47.540    48.35        99
  samsung | 2015.04.06T10:04:44.844    48.35        99

Sistem Komutları

Sistem komutları, qçevre. Aşağıdaki biçimlerdendir -

\cmd [p]       where p may be optional

Popüler sistem komutlarından bazıları aşağıda tartışılmıştır -

\ a [ad alanı] - Verilen ad alanındaki tabloları listeler

q)/Tables in default namespace

q)\a
,`trade

q)\a .o         / table in .o namespace.
,`TI

\ b - Bağımlılıkları görüntüleyin

q)/ views/dependencies

q)a:: x+y      / global assingment

q)b:: x+1

q)\b
`s#`a`b

\ B - Bekleyen görünümler / bağımlılıklar

q)/ Pending views/dependencies

q)a::x+1     / a depends on x

q)\B         / the dependency is pending
' / the dependency is pending

q)\B
`s#`a`b

q)\b
`s#`a`b

q)b
29

q)a
29

q)\B
`symbol$()

\ cd - Dizini değiştir

q)/change directory, \cd [name]

q)\cd
"C:\\Users\\myaccount-raj"

q)\cd ../new-account

q)\cd
"C:\\Users\\new-account"

\ d - geçerli ad alanını ayarlar

q)/ sets current namespace \d [namespace]

q)\d             /default namespace
'

q)\d .o          /change to .o

q.o)\d
`.o

q.o)\d .         / return to default

q)key `          /lists namespaces other than .z
`q`Q`h`j`o

q)\d .john       /change to non-existent namespace

q.john)\d
`.john

q.john)\d .

q)\d
`.

\ l - db'den dosya veya dizin yükle

q)/ Load file or directory, \l

q)\l test2.q / loading test2.q which is stored in current path.

   ric      |     date      ex      openP    closeP    MCap
----------- | -------------------------------------------------
 JPMORGAN   | 2008.05.23  SENSEX  18.30185  17.16319  17876
   HSBC     | 2002.05.21  NIFTY   2.696749  16.58846  26559
 JPMORGAN   | 2006.09.07  NIFTY   14.15219  20.05624  14557
   HSBC     | 2010.10.11  SENSEX  7.394497  25.45859  29366
 JPMORGAN   | 2007.10.02  SENSEX  1.558085  25.61478  20390
 
   ric     |    date       ex      openP     closeP    MCap
---------- | ------------------------------------------------
  INFOSYS  | 2003.10.30    DOW    21.2342   7.565652   2375
 RELIANCE  | 2004.08.12    DOW    12.34132  17.68381   4201
   SBIN    | 2008.02.14    DOW    1.830857  9.006485   15465
  INFOSYS  | 2009.06.11  HENSENG  19.47664  12.05208   11143
   SBIN    | 2010.07.05    DOW    18.55637  10.54082   15873

\ p - bağlantı noktası numarası

q)/ assign port number, \p

q)\p
5001i

q)\p 8888

q)\p
8888i

\\ - q konsolundan çık

\\ - exit
Exit form q.

qprogramlama dili, zengin ve güçlü yerleşik işlevlere sahiptir. Yerleşik bir işlev aşağıdaki türlerde olabilir -

  • String function - Girdi olarak bir dizge alır ve bir dizge döndürür.

  • Aggregate function - Giriş olarak bir liste alır ve bir atom döndürür.

  • Uniform function - Bir liste alır ve aynı sayıya sahip bir liste döndürür.

  • Mathematical function - Sayısal bağımsız değişken alır ve sayısal bir bağımsız değişken döndürür.

  • Miscellaneous function - Yukarıda belirtilenler dışındaki tüm işlevler.

String Fonksiyonları

Like - desen eşleştirme

q)/like is a dyadic, performs pattern matching, return 1b on success else 0b

q)"John" like "J??n"
1b

q)"John My Name" like "J*"
1b

ltrim - önde gelen boşlukları kaldırır

q)/ ltrim - monadic ltrim takes string argument, removes leading blanks

q)ltrim " Rick "
"Rick "

rtrim - arkadaki boşlukları kaldırır

q)/rtrim - takes string argument, returns the result of removing trailing blanks

q)rtrim " Rick "
" Rick"

ss - dize araması

q)/ss - string search, perform pattern matching, same as "like" but return the indices of the matches of the pattern in source.

q)"Life is beautiful" ss "i"
1 5 13

trim - baştaki ve sondaki boşlukları kaldırır

q)/trim - takes string argument, returns the result of removing leading & trailing blanks

q)trim " John "
"John"

Matematiksel Fonksiyonlar

acos - cos'un tersi

q)/acos - inverse of cos, for input between -1 and 1, return float between 0 and pi

q)acos 1
0f

q)acos -1
3.141593

q)acos 0
1.570796

cor - korelasyon verir

q)/cor - the dyadic takes two numeric lists of same count, returns a correlation between the items of the two arguments

q)27 18 18 9 0 cor 27 36 45 54 63
-0.9707253

çapraz - Kartezyen ürün

q)/cross - takes atoms or lists as arguments and returns their Cartesian product

q)9 18 cross `x`y`z

9 `x
9 `y
9 `z

18 `x
18 `y
18 `z

değişken - varyans

q)/var - monadic, takes a scaler or numeric list and returns a float equal to the mathematical variance of the items

q)var 45
0f

q)var 9 18 27 36
101.25

wavg

q)/wavg - dyadic, takes two numeric lists of the same count and returns the average of the second argument weighted by the first argument.

q)1 2 3 4 wavg 200 300 400 500
400f

Toplama İşlevleri

tümü - & işlem

q)/all - monadic, takes a scaler or list of numeric type and returns the result of & applied across the items.

q)all 0b
0b

q)all 9 18 27 36
1b

q)all 10 20 30
1b

Herhangi - | operasyon

q)/any - monadic, takes scaler or list of numeric type and the return the result of | applied across the items

q)any 20 30 40 50
1b

q)any 20012.02.12 2013.03.11
'20012.02.12

prd - aritmetik çarpım

q)/prd - monadic, takes scaler, list, dictionary or table of numeric type and returns the arithmetic product.

q)prd `x`y`z! 10 20 30
6000

q)prd ((1 2; 3 4);(10 20; 30 40))

10 40
90 160

Toplam - aritmetik toplam

q)/sum - monadic, takes a scaler, list,dictionary or table of numeric type and returns the arithmetic sum.

q)sum 2 3 4 5 6
20

q)sum (1 2; 4 5)
5 7

Tekdüzen İşlevler

Deltalar - önceki öğesinden fark.

q)/deltas -takes a scalar, list, dictionary or table and returns the difference of each item from its predecessor.

q)deltas 2 3 5 7 9
2 1 2 2 2

q)deltas `x`y`z!9 18 27

x | 9
y | 9
z | 9

doldurur - boş değeri doldurur

q)/fills - takes scalar, list, dictionary or table of numeric type and returns a c copy of the source in which non-null items are propagated forward to fill nulls

q)fills 1 0N 2 0N 4
1 1 2 2 4

q)fills `a`b`c`d! 10 0N 30 0N

a | 10
b | 10
c | 30
d | 30

maxs - kümülatif maksimum

q)/maxs - takes scalar, list, dictionary or table and returns the cumulative maximum of the source items.

q)maxs 1 2 4 3 9 13 2
1 2 4 4 9 13 13

q)maxs `a`b`c`d!9 18 0 36

a | 9
b | 18
c | 18
d | 36

Çeşitli Fonksiyonlar

Sayı - eleman sayısı döndür

q)/count - returns the number of entities in its argument.

q)count 10 30 30
3

q)count (til 9)
9

q)count ([]a:9 18 27;b:1.1 2.2 3.3)
3

Distinct - farklı varlıkları döndür

q)/distinct - monadic, returns the distinct entities in its argument

q)distinct 1 2 3 4 2 3 4 5 6 9
1 2 3 4 5 6 9

Hariç - ikinci bağımsız değişkende öğe yok.

q)/except - takes a simple list (target) as its first argument and returns a list containing the items of target that are not in its second argument

q)1 2 3 4 3 1 except 1
2 3 4 3

doldur - boş değeri ilk argümanla doldur

q)/fill (^) - takes an atom as its first argument and a list(target) as its second argument and return a list obtained by substituting the first argument for every occurrence of null in target

q)42^ 9 18 0N 27 0N 36
9 18 42 27 42 36

q)";"^"Life is Beautiful"
"Life;is;Beautiful"

İçindeki sorgular qdaha kısa ve basittir ve sql'nin yeteneklerini genişletir. Ana sorgu ifadesi, en basit haliyle alt tabloları çıkaran ancak yeni sütunlar da oluşturabilen 'seçme ifadesi'dir.

Genel formu Select expression aşağıdaki gibidir -

Select columns by columns from table where conditions

**Note − by & where ifadeler isteğe bağlıdır, yalnızca 'ifadeden' zorunludur.

Genel olarak sözdizimi şöyle olacaktır:

select [a] [by b] from t [where c]
update [a] [by b] from t [where c]

Sözdizimi q ifadeler SQL'e oldukça benzer, ancak qifadeler basit ve güçlüdür. Yukarıdakine eşdeğer bir sql ifadesiq ifade aşağıdaki gibi olacaktır -

select [b] [a] from t [where c] [group by b order by b]
update t set [a] [where c]

Tüm maddeler sütunlar üzerinde yürütülür ve bu nedenle qsiparişten yararlanabilirsiniz. Sql sorguları sıraya dayalı olmadığından bu avantajı kullanamazlar.

qilişkisel sorguların boyutu, karşılık gelen sql'lerine kıyasla genellikle çok daha küçüktür. Sıralı ve işlevsel sorgular, sql'de zor olan şeyler yapar.

Tarihsel bir veri tabanında, wherecümlesi, sorgunun performansını etkilediği için çok önemlidir. partition değişken (tarih / ay / gün) her zaman önce gelir ve ardından sıralı ve dizine alınmış sütun (genellikle sym sütunu) gelir.

Örneğin,

select from table where date in d, sym in s

şundan çok daha hızlıdır:

select from table where sym in s, date in d

Temel Sorgular

Not defterine (aşağıdaki gibi) bir sorgu betiği yazalım, kaydedelim (* .q olarak) ve sonra yükleyelim.

sym:asc`AIG`CITI`CSCO`IBM`MSFT;
ex:"NASDAQ"
dst:`$":c:/q/test/data/"; /database destination @[dst;`sym;:;sym]; n:1000000; trade:([]sym:n?`sym;time:10:30:00.0+til n;price:n?3.3e;size:n?9;ex:n?ex); quote:([]sym:n?`sym;time:10:30:00.0+til n;bid:n?3.3e;ask:n?3.3e;bsize:n?9;asize:n?9;ex:n?ex); {@[;`sym;`p#]`sym xasc x}each`trade`quote; d:2014.08.07 2014.08.08 2014.08.09 2014.08.10 2014.08.11; /Date vector can also be changed by the user dt:{[d;t].[dst;(`$string d;t;`);:;value t]};
d dt/:\:`trade`quote;

Note: Once you run this query, two folders .i.e. "test" and "data" will be created under "c:/q/", and date partition data can be seen inside data folder.

Kısıtlı Sorgular

* Denotes HDB query

Select all IBM trades

select from trade where sym in `IBM

*Select all IBM trades on a certain day

thisday: 2014.08.11
select from trade where date=thisday,sym=`IBM

Select all IBM trades with a price > 100

select from trade where sym=`IBM, price > 100.0

Select all IBM trades with a price less than or equal to 100

select from trade where sym=`IBM,not price > 100.0

*Select all IBM trades between 10.30 and 10.40, in the morning, on a certain date

thisday: 2014.08.11
select from trade where
date = thisday, sym = `IBM, time > 10:30:00.000,time < 10:40:00.000

Select all IBM trades in ascending order of price

`price xasc select from trade where sym =`IBM

*Select all IBM trades in descending order of price in a certain time frame

`price xdesc select from trade where date within 2014.08.07 2014.08.11, sym =`IBM

Composite sort − sort ascending order by sym and then sort the result in descending order of price

`sym xasc `price xdesc select from trade where date = 2014.08.07,size = 5

Select all IBM or MSFT trades

select from trade where sym in `IBM`MSFT

*Calculate count of all symbols in ascending order within a certain time frame

`numsym xasc select numsym: count i by sym from trade where date within 2014.08.07 2014.08.11

*Calculate count of all symbols in descending order within a certain time frame

`numsym xdesc select numsym: count i by sym from trade where date within 2014.08.07 2014.08.11

* What is the maximum price of IBM stock within a certain time frame, and when does this first happen?

select time,ask from quote where date within 2014.08.07 2014.08.11,
sym =`IBM, ask = exec first ask from select max ask from quote where
sym =`IBM

Select the last price for each sym in hourly buckets

select last price by hour:time.hh, sym from trade

Toplamalı Sorgular

* Calculate vwap (Volume Weighted Average Price) of all symbols

select vwap:size wavg price by sym from trade

* Count the number of records (in millions) for a certain month

(select trade:1e-6*count i by date.dd from trade where date.month=2014.08m) + select quote:1e-6*count i by date.dd from quote where date.month=2014.08m

* HLOC – Daily High, Low, Open and Close for CSCO in a certain month

select high:max price,low:min price,open:first price,close:last price by date.dd from trade where date.month=2014.08m,sym =`CSCO

* Daily Vwap for CSCO in a certain month

select vwap:size wavg price by date.dd from trade where date.month = 2014.08m ,sym = `CSCO

* Calculate the hourly mean, variance and standard deviation of the price for AIG

select mean:avg price, variance:var price, stdDev:dev price by date, hour:time.hh from trade where sym = `AIG

Select the price range in hourly buckets

select range:max[price] – min price by date,sym,hour:time.hh from trade

* Daily Spread (average bid-ask) for CSCO in a certain month

select spread:avg bid-ask by date.dd from quote where date.month = 2014.08m, sym = `CSCO

* Daily Traded Values for all syms in a certain month

select dtv:sum size by date,sym from trade where date.month = 2014.08m

Extract a 5 minute vwap for CSCO

select size wavg price by 5 xbar time.minute from trade where sym = `CSCO

* Extract 10 minute bars for CSCO

select high:max price,low:min price,close:last price by date, 10 xbar time.minute from trade where sym = `CSCO

* Find the times when the price exceeds 100 basis points (100e-4) over the last price for CSCO for a certain day

select time from trade where date = 2014.08.11,sym = `CSCO,price > 1.01*last price

* Full Day Price and Volume for MSFT in 1 Minute Intervals for the last date in the database

select last price,last size by time.minute from trade where date = last date, sym = `MSFT

KDB +, bir işlemin başka bir süreçle süreçler arası iletişim yoluyla iletişim kurmasına izin verir. Kdb + süreçleri aynı bilgisayardaki, aynı ağdaki ve hatta uzaktan herhangi bir diğer kdb + 'ya bağlanabilir. Sadece bağlantı noktasını belirtmemiz gerekiyor ve müşteriler o bağlantı noktasıyla konuşabilir. Hiçq süreç herhangi bir başkasıyla iletişim kurabilir q ağda erişilebilir olduğu ve bağlantıları dinlediği sürece işlem yapın.

  • bir sunucu işlemi bağlantıları dinler ve tüm istekleri işler

  • bir istemci işlemi bağlantıyı başlatır ve yürütülecek komutları gönderir

İstemci ve sunucu aynı makinede veya farklı makinelerde olabilir. Bir işlem hem istemci hem de sunucu olabilir.

Bir iletişim olabilir,

  • Synchronous (bir sonucun döndürülmesini bekleyin)

  • Asynchronous (bekleme yok ve sonuç döndürülmedi)

Sunucuyu Başlat

Bir q sunucu, dinlenecek bağlantı noktası belirtilerek başlatılır,

q –p 5001 / command line
\p 5001   / session command

İletişim Kolu

İletişim tanıtıcısı, ":" ile başlayan ve şu biçime sahip bir semboldür:

`:[server]:port-number

Misal

`::5001              / server and client on same machine
`:jack:5001          / server on machine jack
`:192.168.0.156      / server on specific IP address
`:www.myfx.com:5001  / server at www.myfx.com

Bağlantıyı başlatmak için, bir tamsayı bağlantı tutamacı döndüren "hopen" işlevini kullanıyoruz. Bu tutamaç, sonraki tüm istemci istekleri için kullanılır. Örneğin -

q)h:hopen `::5001

q)h"til 5"
0 1 2 3 4

q)hclose h

Eşzamanlı ve Eşzamansız Mesajlar

Bir tutamağa sahip olduğumuzda, bir mesajı eşzamanlı veya eşzamansız olarak gönderebiliriz.

Synchronous Message- Bir mesaj gönderildikten sonra bekler ve sonucu döndürür. Formatı aşağıdaki gibidir -

handle “message”

Asynchronous Message- Bir mesaj gönderdikten sonra, beklemeden ve bir sonuç döndürmeden hemen sonraki ifadeyi işlemeye başlayın. Formatı aşağıdaki gibidir -

neg[handle] “message”

Bir yanıt gerektiren mesajlar, örneğin işlev çağrıları veya seçim ifadeleri, normal olarak eşzamanlı formu kullanır; bir çıktı döndürmesi gerekmeyen mesajlar, örneğin bir tabloya güncellemeler eklemek, zaman uyumsuz olacaktır.

Zaman q süreç diğerine bağlanır qsüreçler arası iletişim yoluyla süreç, mesaj işleyicileri tarafından işlenir. Bu ileti işleyicilerinin varsayılan bir davranışı vardır. Örneğin, eşzamanlı mesaj işleme durumunda, işleyici sorgunun değerini döndürür. Bu durumda eşzamanlı işleyici.z.pg, ihtiyaca göre geçersiz kılabileceğimiz.

Kdb + işlemlerinin önceden tanımlanmış birkaç ileti işleyicisi vardır. Veritabanını yapılandırmak için ileti işleyicileri önemlidir. Bazı kullanımlar şunları içerir -

  • Logging - Gelen mesajları günlüğe kaydedin (herhangi bir önemli hata durumunda faydalıdır),

  • Security- Kullanıcı adı / ip adresine bağlı olarak veritabanına, belirli işlev çağrılarına vb. Erişime izin verin / vermeyin. Yalnızca yetkili abonelere erişim sağlamaya yardımcı olur.

  • Handle connections/disconnections diğer süreçlerden.

Önceden Tanımlanmış İleti İşleyicileri

Önceden tanımlanmış mesaj işleyicilerinin bazıları aşağıda tartışılmaktadır.

.z.pg

Senkronize bir mesaj işleyicidir (işlem alma). Bu işlev, bir kdb + örneğinde bir senkronizasyon mesajı alındığında otomatik olarak çağrılır.

Parametre, yürütülecek dizi / işlev çağrısıdır, yani iletilen mesajdır. Varsayılan olarak şu şekilde tanımlanır -

.z.pg: {value x}                / simply execute the message 
                                received but we can overwrite it to
give any customized result.
.z.pg : {handle::.z.w;value x}  / this will store the remote handle
.z.pg : {show .z.w;value x}     / this will show the remote handle

.z.ps

Eşzamansız bir mesaj işleyicidir (işlem kümesi). Eşzamansız mesajlar için eşdeğer işleyicidir. Parametre, yürütülecek dizi / işlev çağrısıdır. Varsayılan olarak şu şekilde tanımlanır:

.z.pg : {value x}        / Can be overriden for a customized action.

Aşağıda, korumalı yürütmeyi kullandığımız zaman uyumsuz mesajlar için özelleştirilmiş mesaj işleyicisi yer almaktadır.

.z.pg: {@[value; x; errhandler x]}

Buraya errhandler beklenmedik bir hata durumunda kullanılan bir işlevdir.

.z.po []

Bir bağlantı açık işleyicidir (işlem açık). Uzak bir işlem bir bağlantı açtığında yürütülür. Bir sürece bağlantı açıldığında tanıtıcıyı görmek için .z.po'yu şu şekilde tanımlayabiliriz:

.z.po : {Show “Connection opened by” , string h: .z.h}

.z.pc []

Bir yakın bağlantı işleyicisidir (işlem-kapanış). Bağlantı kapatıldığında çağrılır. Global bağlantı tutamacını 0'a sıfırlayabilen ve zamanlayıcıyı her 3 saniyede bir (3000 milisaniye) ateşlemek (yürütmek) için bir komut verebilen kendi yakın işleyicimizi oluşturabiliriz.

.z.pc : { h::0; value “\\t 3000”}

Zamanlayıcı işleyici (.z.ts) bağlantıyı yeniden açmaya çalışır. Başarı durumunda zamanlayıcıyı kapatır.

.z.ts : { h:: hopen `::5001; if [h>0; value “\\t 0”] }

.z.pi []

PI, işlem girişi anlamına gelir. Her türlü girdi için çağrılır. Konsol girişini veya uzak istemci girişini işlemek için kullanılabilir. .Z.pi [] kullanılarak konsol girişi doğrulanabilir veya varsayılan ekran değiştirilebilir. Ek olarak, her türlü loglama işlemi için kullanılabilir.

q).z.pi
'.z.pi

q).z.pi:{">", .Q.s value x}

q)5+4
>9

q)30+42
>72

q)30*2
>60

q)\x .z.pi
>q)

q)5+4
9

.z.pw

Bir doğrulama bağlantı işleyicisidir (kullanıcı kimlik doğrulaması). Bir kdb + oturumuna bağlantı açıldığında fazladan bir geri arama ekler. –U / -U kontrollerinden sonra ve .z.po'dan (bağlantı noktası açık) önce çağrılır.

.z.pw : {[user_id;passwd] 1b}

Girişler userid (sembol) ve password (Metin).

Bir tablonun listeleri, sözlükleri veya sütunlarına uygulanan öznitelikler olabilir. Nitelikler, listeye belirli özellikleri empoze eder. Bazı özellikler, değişiklik sırasında kaybolabilir.

Öznitelik Türleri

Sıralandı ("s #)

`s #, listenin artan sırada sıralandığı anlamına gelir. Bir liste açıkça asc (veya xasc) ile sıralanırsa, liste otomatik olarak sıralanmış öznitelik kümesine sahip olacaktır.

q)L1: asc 40 30 20 50 9 4

q)L1
`s#4 9 20 30 40 50

Sıralanacağı bilinen bir listenin özniteliği de açıkça belirtilebilir. Q listenin sıralanıp sıralanmadığını kontrol edecek ve değilse, s-fail hata atılacak.

q)L2:30 40 24 30 2

q)`s#L2
's-fail

Sıralanan öznitelik, sıralanmamış bir ekleme üzerine kaybolacaktır.

Ayrılmış (`p #)

`p #, listenin bölünmüş olduğu ve aynı öğelerin bitişik olarak depolandığı anlamına gelir.

Aralık bir int veya temporal type Yıllar, aylar, günler vb. gibi temel bir int değerine sahip olmak. Ayrıca numaralandırılması koşuluyla bir sembol üzerinde bölümleme yapabilirsiniz.

Parted niteliğinin uygulanması, her benzersiz çıktı değerini ilk oluşumunun konumuna eşleyen bir dizin sözlüğü oluşturur. Bir liste bölündüğünde, doğrusal aramanın yerini hashtable arama aldığından arama çok daha hızlıdır.

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 özniteliği, işlem bölümlemeyi koruyor olsa bile listedeki bir işlem altında korunmaz.

  • Bölümlü nitelik, varlıkların sayısı bir milyara ulaştığında ve bölümlerin çoğu önemli boyutta olduğunda, yani önemli bir tekrar olduğunda dikkate alınmalıdır.

Gruplanmış ("g #)

`g #, listenin gruplandığı anlamına gelir. Önemli bir depolama alanı gerektiren, her benzersiz öğeyi kendi indekslerinin her birine eşleyen bir dahili sözlük oluşturulmuş ve bakımı yapılmıştır. Uzunluk listesi içinL kapsamak u benzersiz boyutta öğeler s, Bu olacak (L × 4) + (u × s) bayt.

Gruplama, yapısı hakkında başka hiçbir varsayımda bulunulamadığında bir listeye uygulanabilir.

Nitelik, yazılan herhangi bir listeye uygulanabilir. Eklerde tutulur, ancak silme işlemlerinde kaybolur.

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

Benzersiz (`#u)

Bir listeye benzersiz niteliğin ("u #) uygulanması, listedeki öğelerin farklı olduğunu gösterir. Bir listenin unsurlarının benzersiz olduğunu bilmek önemli ölçüde hızlanırdistinct ve izin verir q bazı karşılaştırmaları erken yapmak için.

Bir liste benzersiz olarak işaretlendiğinde, listedeki her öğe için dahili bir karma harita oluşturulur. Listedeki işlemler benzersizliği korumalıdır, aksi takdirde öznitelik kaybolur.

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 #, benzersizliği koruyan birleştirmelerde korunur. Silme işlemlerinde ve benzersiz olmayan birleştirmelerde kaybolur.

  • "U # listelerinde yapılan aramalar bir hash işlevi aracılığıyla yapılır.

Öznitelikleri Kaldırma

Öznitelikler, `# uygulanarak kaldırılabilir.

Öznitelikleri Uygulama

Öznitelikleri uygulamak için üç biçim:

  • L: `s# 14 2 3 3 9/ Liste oluşturma sırasında belirtin

  • @[ `.; `L ; `s#]/ Fonksiyonel uygulama, yani L değişken listesine

    / varsayılan ad alanında (yani ".)

    / sıralanan # özniteliği

  • Update `s#time from `tab

    / Tabloyu (sekmeyi) güncelleyerek

    / öznitelik.

Yukarıdaki üç farklı formatı örneklerle uygulayalım.

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

Fonksiyonel (Dinamik) sorgular, sütun adlarının tipik q-sql seçme / yürütme / silme sütunlarına sembol olarak belirtilmesine izin verir. Sütun adlarını dinamik olarak belirtmek istediğimizde çok kullanışlı oluyor.

İşlevsel formlar -

?[t;c;b;a]    / for select
![t;c;b;a]    / for update

nerede

  • t bir tablodur;

  • a kümeler sözlüğüdür;

  • byan cümle; ve

  • c kısıtlamaların bir listesidir.

Not -

  • Herşey q varlıklar a, b, ve c Varlık adlarını içeren semboller anlamına gelen ada göre başvurulmalıdır.

  • Seçme ve güncellemenin sözdizimsel biçimleri, eşdeğer işlevsel biçimlerine ayrıştırılır. q tercüman, bu nedenle iki form arasında performans farkı yoktur.

Fonksiyonel seçim

Aşağıdaki kod bloğu nasıl kullanılacağını gösterir functional select -

q)t:([]n:`ibm`msft`samsung`apple;p:40 38 45 54)

q)t

    n       p
-------------------
   ibm     40
   msft    38
 samsung   45
  apple    54

q)select m:max p,s:sum p by name:n from t where p>36, n in `ibm`msft`apple

  name |   m   s
------ | ---------
 apple |  54  54
 ibm   |  40  40
 msft  |  38  38

örnek 1

En kolay durumla başlayalım, işlevsel versiyonu “select from t” gibi görünecek -

q)?[t;();0b;()]     / select from t

    n      p
-----------------
   ibm    40
   msft   38
 samsung  45
  apple   54

Örnek 2

Aşağıdaki örnekte, uygun varlıkların liste olmasını sağlamak için tekil oluşturmak için enlist işlevini kullanıyoruz.

q)wherecon: enlist (>;`p;40)

q)?[`t;wherecon;0b;()] / select from t where p > 40

    n      p
----------------
 samsung  45
  apple   54

Örnek 3

q)groupby: enlist[`p] ! enlist `p

q)selcols: enlist [`n]!enlist `n

q)?[ `t;(); groupby;selcols]        / select n by p from t

   p  |    n
----- | -------
  38  |  msft
  40  |  ibm
  45  | samsung
  54  | apple

Fonksiyonel Yürütme

İşlevsel yürütme biçimi, basitleştirilmiş bir biçimdir select.

q)?[t;();();`n]                / exec n from t (functional form of exec)
`ibm`msft`samsung`apple

q)?[t;();`n;`p]                / exec p by n from t (functional exec)

apple   | 54
ibm     | 40
msft    | 38
samsung | 45

Fonksiyonel Güncelleme

İşlevsel güncelleme biçimi tamamen benzerdir. select. Aşağıdaki örnekte, enlist kullanımı, giriş varlıklarının liste olmasını sağlamak için tekil oluşturmaktır.

q)c:enlist (>;`p;0)

q)b: (enlist `n)!enlist `n

q)a: (enlist `p) ! enlist (max;`p)

q)![t;c;b;a]

   n      p
-------------
  ibm    40
  msft   38
 samsung 45
 apple   54

İşlevsel silme

İşlevsel silme, işlevsel güncellemenin basitleştirilmiş bir biçimidir. Sözdizimi aşağıdaki gibidir -

![t;c;0b;a]        / t is a table, c is a list of where constraints, a is a
                   / list of column names

Şimdi işlevsel silme işleminin nasıl çalıştığını göstermek için bir örnek verelim -

q)![t; enlist (=;`p; 40); 0b;`symbol$()]
                                          / delete from t where p = 40
   n       p
---------------
  msft    38
 samsung  45
  apple   54

Bu bölümde, sözlükler ve ardından tablolar üzerinde nasıl çalışılacağını öğreneceğiz. Sözlüklerle başlayalım -

q)d:`u`v`x`y`z! 9 18 27 36 45                  / Creating a dictionary d

q)/ key of this dictionary (d) is given by

q)key d
`u`v`x`y`z

q)/and the value by

q)value d
9 18 27 36 45

q)/a specific value

q)d`x
27

q)d[`x]
27

q)/values can be manipulated by using the arithmetic operator +-*% as,

q)45 + d[`x`y]
72 81

Sözlük değerlerinin değiştirilmesi gerekiyorsa, değişiklik formülasyonu şöyle olabilir:

q)@[`d;`z;*;9]
`d

q)d

u | 9
v | 18
x | 27
y | 36

q)/Example, table tab

q)tab:([]sym:`;time:0#0nt;price:0n;size:0N)

q)n:10;sym:`IBM`SAMSUNG`APPLE`MSFT

q)insert[`tab;(n?sym;("t"$.z.Z);n?100.0;n?100)]
0 1 2 3 4 5 6 7 8 9

q)`time xasc `tab
`tab

q)/ to get particular column from table tab

q)tab[`size]
12 10 1 90 73 90 43 90 84 63

q)tab[`size]+9
21 19 10 99 82 99 52 99 93 72

z | 405

q)/Example table tab

q)tab:([]sym:`;time:0#0nt;price:0n;size:0N)

q)n:10;sym:`IBM`SAMSUNG`APPLE`MSFT

q)insert[`tab;(n?sym;("t"$.z.Z);n?100.0;n?100)] 0 1 2 3 4 5 6 7 8 9 q)`time xasc `tab `tab q)/ to get particular column from table tab q)tab[`size] 12 10 1 90 73 90 43 90 84 63 q)tab[`size]+9 21 19 10 99 82 99 52 99 93 72 q)/Example table tab q)tab:([]sym:`;time:0#0nt;price:0n;size:0N) q)n:10;sym:`IBM`SAMSUNG`APPLE`MSFT q)insert[`tab;(n?sym;("t"$.z.Z);n?100.0;n?100)]
0 1 2 3 4 5 6 7 8 9

q)`time xasc `tab
`tab

q)/ to get particular column from table tab

q)tab[`size]
12 10 1 90 73 90 43 90 84 63

q)tab[`size]+9
21 19 10 99 82 99 52 99 93 72

q)/We can also use the @ amend too

q)@[tab;`price;-;2]

   sym      time           price     size
--------------------------------------------
  APPLE   11:16:39.779   6.388858     12
  MSFT    11:16:39.779   17.59907     10
  IBM     11:16:39.779   35.5638      1
 SAMSUNG  11:16:39.779   59.37452     90
  APPLE   11:16:39.779   50.94808     73
 SAMSUNG  11:16:39.779   67.16099     90
  APPLE   11:16:39.779   20.96615     43
 SAMSUNG  11:16:39.779   67.19531     90
  IBM     11:16:39.779   45.07883     84
  IBM     11:16:39.779   61.46716     63

q)/if the table is keyed

q)tab1:`sym xkey tab[0 1 2 3 4]

q)tab1

   sym    |   time          price     size
--------- | ----------------------------------
  APPLE   | 11:16:39.779   8.388858    12
  MSFT    | 11:16:39.779   19.59907    10
  IBM     | 11:16:39.779   37.5638     1
 SAMSUNG  | 11:16:39.779   61.37452    90
  APPLE   | 11:16:39.779   52.94808    73

q)/To work on specific column, try this

q){tab1[x]`size} each sym
1 90 12 10

q)(0!tab1)`size
12 10 1 90 73

q)/once we got unkeyed table, manipulation is easy

q)2+ (0!tab1)`size
14 12 3 92 75

Sabit diskinizdeki veriler (tarihsel veritabanı da denir) üç farklı formatta kaydedilebilir - Düz Dosyalar, Yayılmış Tablolar ve Bölümlenmiş Tablolar. Burada, verileri kaydetmek için bu üç formatı nasıl kullanacağımızı öğreneceğiz.

Düz bir dosya

Düz dosyalar belleğe tam olarak yüklenir, bu nedenle boyutları (bellek ayak izi) küçük olmalıdır. Tablolar tamamen tek bir dosyada diske kaydedilir (bu nedenle boyut önemlidir).

Bu tabloları değiştirmek için kullanılan işlevler set/get -

`:path_to_file/filename set tablename

Nasıl çalıştığını göstermek için bir örnek alalım -

q)tables `.
`s#`t`tab`tab1 

q)`:c:/q/w32/tab1_test set tab1
`:c:/q/w32/tab1_test

Windows ortamında, düz dosyalar konuma kaydedilir - C:\q\w32

Düz dosyayı diskinizden (tarihsel db) alın ve get aşağıdaki gibi komut -

q)tab2: get `:c:/q/w32/tab1_test

q)tab2

   sym    |   time           price   size
--------- | -------------------------------
  APPLE   | 11:16:39.779   8.388858   12
  MSFT    | 11:16:39.779   19.59907   10
  IBM     | 11:16:39.779   37.5638    1
 SAMSUNG  | 11:16:39.779   61.37452   90
  APPLE   | 11:16:39.779   52.94808   73

Yeni bir tablo oluşturuldu tab2 içeriği depolanmış tab1_test dosya.

Yayılı Tablolar

Tabloda çok fazla sütun varsa, bu tür tabloları yayılmış biçimde saklarız, yani onları bir dizine diske kaydederiz. Dizinin içindeki her sütun, sütun adıyla aynı adla ayrı bir dosyaya kaydedilir. Her sütun, bir kdb + ikili dosyasında karşılık gelen türlerin bir listesi olarak kaydedilir.

Bir tabloyu yayvan biçimde kaydetmek, birçok sütunundan yalnızca birkaç sütuna sıklıkla erişmemiz gerektiğinde çok kullanışlıdır. Yayılmış bir tablo dizini şunları içerir:.d sütunların sırasını içeren ikili dosya.

Düz bir dosyaya çok benzer şekilde, bir tablo aşağıdaki gibi kaydedilebilir: setkomut. Bir tabloyu yayvan olarak kaydetmek için, dosya yolu bir boşlukla bitmelidir -

`:path_to_filename/filename/ set tablename

Yayılmış bir tabloyu okumak için, get işlev -

tablename: get `:path_to_file/filename

Note - Bir tablonun açık olarak kaydedilebilmesi için anahtarsız ve numaralandırılmış olması gerekir.

Windows ortamında dosya yapınız aşağıdaki gibi görünecektir -

Bölümlenmiş Tablolar

Bölümlendirilmiş tablolar, önemli miktarda veri içeren devasa tabloları yönetmek için etkili bir yol sağlar. Bölümlenmiş tablolar, daha fazla bölüme (dizinler) yayılmış yayılmış tablolardır.

Her bölümün içinde, bir tablonun, yayvan bir tablonun yapısıyla birlikte kendi dizini olacaktır. Tablolar, içeriğine optimize edilmiş erişim sağlamak için gün / ay / yıl temelinde bölünebilir.

Bölümlenmiş bir tablonun içeriğini almak için aşağıdaki kod bloğunu kullanın -

q)get `:c:/q/data/2000.01.13              // “get” command used, sample folder

quote| +`sym`time`bid`ask`bsize`asize`ex!(`p#`sym!0 0 0 0 0 0 0 0 0 0 0
0 0 0….

trade| +`sym`time`price`size`ex!(`p#`sym!0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 ….

Bir ticaret tablosunun içeriğini almaya çalışalım -

q)get `:c:/q/data/2000.01.13/trade

   sym    time            price     size    ex
--------------------------------------------------
    0   09:30:00.496    0.4092016    7      T
    0   09:30:00.501    1.428629     4      N
    0   09:30:00.707    0.5647834    6      T
    0   09:30:00.781    1.590509     5      T
    0   09:30:00.848    2.242627     3      A
    0   09:30:00.860    2.277041     8      T
    0   09:30:00.931    0.8044885    8      A
    0   09:30:01.197    1.344031     2      A
    0   09:30:01.337    1.875        3      A
    0   09:30:01.399    2.187723     7      A

Note - Bölümlenmiş mod, günde milyonlarca kayıt içeren tablolar için uygundur (yani, zaman serisi verileri)

Sym dosyası

Sym dosyası, yayılmış ve bölümlenmiş tüm tablolardan sembollerin listesini içeren bir kdb + ikili dosyasıdır. İle okunabilir,

get `:sym

par.txt dosyası (isteğe bağlı)

Bu, bölümler birkaç dizine / disk sürücüsüne yayıldığında kullanılan ve disk bölümlerinin yollarını içeren bir yapılandırma dosyasıdır.

.Q.en

.Q.enbir sembol sütununu numaralandırarak bir tablonun açılmasına yardımcı olan ikili bir işlevdir. Özellikle tarihsel db (yayılı, bölüm tabloları vb.) İle uğraşırken kullanışlıdır. -

.Q.en[`:directory;table]

nerede directory tarihsel veritabanının ana dizinidir, burada sym file bulunur ve table numaralandırılacak tablodur.

Tabloların manuel olarak numaralandırılması, bunları açılmış tablolar olarak kaydetmek için gerekli değildir, çünkü bu -

.Q.en[`:directory_where_symbol_file_stored]table_name

.Q.dpft

.Q.dpftişlevi, bölümlenmiş ve bölümlenmiş tablolar oluşturmaya yardımcı olur. Gelişmiş şeklidir.Q.en, çünkü sadece tabloyu göstermekle kalmaz, aynı zamanda bir bölüm tablosu da oluşturur.

Kullanılan dört argüman vardır .Q.dpft -

  • bir bölüm oluşturmak istediğimiz veritabanının sembolik dosya tutacağı,

  • q tabloyu bölümleyeceğimiz veri değeri,

  • parted ("p #) özniteliğinin uygulanacağı alanın adı (genellikle" sym) ve

  • tablo adı.

Nasıl çalıştığını görmek için bir örnek alalım -

q)tab:([]sym:5?`msft`hsbc`samsung`ibm;time:5?(09:30:30);price:5?30.25)

q).Q.dpft[`:c:/q/;2014.08.24;`sym;`tab]
`tab

q)delete tab from `
'type

q)delete tab from `/
'type

q)delete tab from .
'type

q)delete tab from `.
`.

q)tab
'tab

Tabloyu sildik tabhafızadan. Şimdi db'den yükleyelim

q)\l c:/q/2014.08.24/

q)\a
,`tab

q)tab

   sym      time      price
-------------------------------
  hsbc    07:38:13   15.64201
  hsbc    07:21:05   5.387037
  msft    06:16:58   11.88076
  msft    08:09:26   12.30159
 samsung  04:57:56   15.60838

.Q.chk

.Q.chk, tek parametresi kök dizinin sembolik dosya tanıtıcısı olan monadik bir işlevdir. Kökteki her bölüm alt dizinini inceleyerek, gerekli olan yerlerde bir bölümde boş tablolar oluşturur.

.Q.chk `:directory

nerede directory tarihsel veritabanının ana dizinidir.