假设我有一个表格,其中包含日期、符号和大小作为列。每个日期的日期按升序排列,大小按降序排列。我如何删节表格,以便每个日期,只保留前几个,比如 10 个记录?命令越简单越好。
提前致谢!
假设我有一个表格,其中包含日期、符号和大小作为列。每个日期的日期按升序排列,大小按降序排列。我如何删节表格,以便每个日期,只保留前几个,比如 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 个索引 ( sublist )。
注意:i
是 kdb 表中的隐式行索引。
'fby' 也是一个不错的选择,通常用于需要对组进行操作/聚合的情况。
http://code.kx.com/q/ref/qsql/#fby
在您的示例中,由于 table 已经为每个日期按降序排列了 '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