【问题标题】:Output top few records by date using kdb使用 kdb 按日期输出前几条记录
【发布时间】:2016-10-31 16:14:39
【问题描述】:

假设我有一个表格,其中包含日期、符号和大小作为列。每个日期的日期按升序排列,大小按降序排列。我如何删节表格,以便每个日期,只保留前几个,比如 10 个记录?命令越简单越好。

提前致谢!

【问题讨论】:

    标签: kdb qsqlquery qsqltablemodel


    【解决方案1】:

    给定一张桌子:

    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 表中的隐式行索引。

    【讨论】:

      【解决方案2】:

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

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

      在您的示例中,由于表中每个日期的“大小”列已经按降序排列,因此获取前 10 行将给出所需的结果。

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

      【讨论】:

        【解决方案3】:

        虽然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
        

        【讨论】:

          猜你喜欢
          • 2020-12-16
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2020-08-22
          • 2016-02-10
          • 2019-06-06
          • 2012-02-09
          • 1970-01-01
          相关资源
          最近更新 更多