📜  Q语言-查询

📅  最后修改于: 2020-11-03 06:52:07             🧑  作者: Mango


q中的查询更短,更简单,并且扩展了sql的功能。主要查询表达式是“选择表达式”,它以最简单的形式提取子表,但它也可以创建新列。

Select表达式的一般形式如下-

Select columns by columns from table where conditions

**注意-用&表示,短语是可选的,只有’from expression’是必需的。

通常,语法为-

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

q表达式的语法看起来与SQL非常相似,但是q表达式简单而强大。上述q表达式的等效sql表达式如下-

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.

约束查询

*表示组建查询

选择所有IBM行业

select from trade where sym in `IBM

*选择特定日期的所有IBM交易

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

选择价格> 100的所有IBM交易

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

选择价格小于或等于100的所有IBM交易

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

*选择在特定日期的上午10.30到10.40之间的所有IBM交易

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

*某月份CSCO的每日Vwap

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

*特定月份所有sym的每日交易价值

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

为CSCO提取5分钟的wwap

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

*提取CSCO的10分钟酒吧

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

*查找某天价格超过CSCO的最后价格超过100个基点(100e-4)的时间

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

*数据库中最后日期的1分钟间隔内MSFT的全天价格和交易量

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