Учебники

Q Language — Запросы

Запросы в q короче и проще и расширяют возможности sql. Основным выражением запроса является «выражение выбора», которое в своей простейшей форме извлекает вложенные таблицы, но также может создавать новые столбцы.

Общая форма выражения Select выглядит следующим образом:

Select columns by columns from table where conditions

** Примечание — по &, где фразы не являются обязательными, только «из выражения» является обязательным.

В общем, синтаксис будет —

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

Синтаксис выражений q выглядит очень похоже на SQL, но выражения q просты и мощны. Эквивалентное выражение sql для приведенного выше выражения q будет выглядеть следующим образом:

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

Все предложения выполняются в столбцах и, следовательно, q может использовать порядок. Поскольку запросы Sql не основаны на порядке, они не могут воспользоваться этим преимуществом.

q реляционные запросы обычно намного меньше по размеру по сравнению с соответствующими им sql. Упорядоченные и функциональные запросы делают сложные вещи в SQL.

В исторической базе данных порядок предложения where очень важен, поскольку он влияет на производительность запроса. Переменная раздела (дата / месяц / день) всегда идет первой, за ней следует отсортированный и проиндексированный столбец (обычно столбец sym).

Например,

select from table where date in d, sym in s

намного быстрее чем,

select from table where sym in s, date in d

Основы Запросы

Давайте напишем скрипт запроса в блокноте (как показано ниже), сохраним (как * .q), а затем загрузим его.

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.

Запросы с ограничениями

* Обозначает запрос HDB

Выбрать все сделки IBM

select from trade where sym in `IBM

* Выберите все сделки IBM в определенный день

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

Выбрать все сделки IBM с ценой> 100

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

Выберите все сделки IBM с ценой, меньшей или равной 100

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

* Выберите все сделки IBM между 10.30 и 10.40, утром, в определенную дату

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

Выбрать все сделки IBM в порядке возрастания цены

`price xasc select from trade where sym =`IBM

* Выберите все сделки IBM в порядке убывания цены за определенный промежуток времени

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

Сложная сортировка — сортировка по возрастанию в порядке возрастания, а затем сортировка результата по убыванию цены.

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

Выбрать все сделки IBM или MSFT

select from trade where sym in `IBM`MSFT

* Рассчитать количество всех символов в порядке возрастания в течение определенного периода времени

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

* Рассчитать количество всех символов в порядке убывания в течение определенного периода времени

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

* Какова максимальная цена акций IBM за определенный период времени и когда это происходит впервые?

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 last price by hour:time.hh, sym from trade

Запросы с агрегациями

* Рассчитать vwap (средневзвешенная цена) всех символов

select vwap:size wavg price by sym from trade

* Подсчитать количество записей (в миллионах) за определенный месяц

(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 — дневной максимум, минимум, открытие и закрытие для CSCO за определенный месяц

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

* Ежедневный Vwap для CSCO в определенный месяц

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

* Рассчитать среднечасовое значение, дисперсию и стандартное отклонение цены для AIG

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

Выберите диапазон цен в почасовых ведрах

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

* Дневной спред (средняя ставка-спрос) для CSCO за определенный месяц

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

* Ежедневные Торговые Значения для всех симов в определенном месяце

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

Извлечь 5 минут VWAP для CSCO

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

* Извлечение 10 минутных баров для CSCO

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

* Найдите время, когда цена превышает 100 базисных пунктов (100e-4) по сравнению с последней ценой CSCO на определенный день

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

* Цена и объем за полный день для MSFT с интервалом в 1 минуту за последнюю дату в базе данных