使用kdb按日期输出前几个记录



假设我有一个表,其中日期、系统和大小作为列。日期按升序排列,大小按降序排列。如何缩短表的长度,使每个日期只保留前几个,比如10个记录?命令越简单越好。

提前感谢!

给定一个表:

q)show tbl:`date`val!/:(.z.d+til 3) cross 100+til 25;
    date       val
    --------------
    2016.10.31 100
    2016.10.31 101
    2016.10.31 102
    2016.10.31 103
    2016.10.31 104
    ..

按日期选择前N行:(N=2)

q)select from tbl where i in{raze y sublist/:group x}[date;2]
    date       val
    --------------
    2016.10.31 100
    2016.10.31 101
    2016.11.01 100
    2016.11.01 101
    2016.11.02 100
    2016.11.02 101

使用group函数-它将返回一个字典,其中包含每个唯一值出现的索引。然后,该函数为每个唯一值检索前N个索引(子列表)。

注意:i是kdb表的隐式行索引

'fby'也是一个很好的选择,通常用于需要对组进行操作/聚合的情况。

http://code.kx.com/q/ref/qsql/fby

在你的例子中,因为表已经有'size' col按降序排列每个日期,所以抓取前10行将得到所需的结果。

q) select from tbl where ({x in 10#x};i) fby date

虽然fby是最好的解决方案,但还有另一种方法可以获得相同的结果:

ungroup select sublist[3] size by date from tbl

但是,对于多列,这将不是一个更干净的方法:

ungroup select sublist[3] size ,sublist[3] sym ,sublist[3] price  by date from tbl

相关内容

  • 没有找到相关文章

最新更新