暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

qSQL与普通SQL的区别

kdb中文教程 2020-12-10
1914


我们将kdb+/q中用于进行表操作的函数集合称为qSQL,因为它们在形式和功能上类似于SQL语言。qSQL既有传统SQL具备的insert、select、update等常用的功能,也具备传统SQL不支持的功能。本篇文章主要介绍qSQL与普通SQL的差别。


首先,传统SQL的select语句对表按行操作,而qSQL是对列对应的数组(column list)进行向量式的操作(SQL中的表按行存储,q中的表是按列存储)。列式存储结构简化了索引与表连接,提高了查询速度,同时在数据库运行时可以方便地对数据列进行增删改。


第二,qSQL提供upsert语义upsert: update and insert)。与字典中的upsert相同,当向字典插入键-值对时,若该键存在,则更新键对应的值,否则该键-值对被插入到字典中。应用qSQL对表进行操作时,q也提供了类似的功能,upsert语义渗透在qSQL的许多应用中,对许多常见操作(例如表连接)都有影响。


第三,q表的行和列都是按顺序存储的,这意味着不需要对结果进行排序,结果是默认排好序的,这在处理时间序列数据时特别有用。


以上三点,再加上q中强大的函数,使得qSQL在处理时间序列数据时既简洁又高效。例如对于下表:

t1:([]ti: 09:30:00 09:30:05 09:30:08 09:30:10 09:30:11; sym:`a`a`b`b`b; price: 10.11 10.15 21.13 21.10 21.11)


在q中,计算每个时刻的价差,可以如下计算:

update change:price-prev price by sym from t1

在传统SQL中,假设最简单的情形,表中已具备了行号id,则需要如下计算:

select a.time,a.price-b.price as diff from t1 a, t1 b where b.id=a.id+1 and b.sym=a.sym


显然qSQL的表达更加简洁、高效。q中还具备加权汇总函数(wavg、wsum等),移动汇总函数(mavg、msum、mmin、mdev等),累计汇总函数(sums、maxs、mins),还有deltas、xprev、next、xbar、differ、med等许多方便计算的内置函数,并可灵活自定义函数,使得qSQL的计算功能十分强大。更多函数相关内容,可参考《kdb+中文教程》第五章


又例如在q中,想要取出t1表中每只证券最大的前两个报价,只需:

select 2 sublist desc price by sym from t1

在传统SQL中,则需要如下写法:

select sym, price from (

         select row_number() over (partition by sym order by prce desc ) as rk,

             sym, price from trade

      ) dt where rk <= 2


q还具备了传统SQL不具备的aj、wj等连接功能。以aj为例,aj的功能是在右表中寻找不超过左表时间等的最新一条记录(更多表连接相关内容,可参考《kdb+中文教程》第六章)。例如:


q) t1:([] ti: 09:30:00 09:30:05 09:30:10; price: 10.11 10.15 10.13)

q) t2: ([] ti: 09:30:00 09:30:01 09:30:05 09:30:08; vol: 0 20 25 60)

q) aj[`ti; t1; t2]

ti       price vol

------------------

09:30:00 10.11 0

09:30:05 10.15 25

09:30:10 10.13 60


qSQL与传统的SQL代码的简单对比中,我们可以看到q语言这种基于有序列表的数据库比传统的基于集合理论的数据库更适合时间序列数据分析。尤其当我们需要进行更复杂计算时,使用qSQL将更加简洁和高效。


《kdb+中文教程》

  全文链接

前言及目录
第一章  简介

第二章  数据类型

第三章  数组

第四章  字典

第五章  函数

第六章  表与qSQL

第七章  I/O操作

第八章  数据库

第九章  应用例子

第十章  问答(含参考文献)




文章转载自kdb中文教程,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论