【问题标题】:kdb: dynamically denormalize a table (convert key values to column names)kdb:动态非规范化表(将键值转换为列名)
【发布时间】:2015-07-13 12:11:12
【问题描述】:

我有一张这样的桌子:

q)t:([sym:(`EURUSD`EURUSD`AUDUSD`AUDUSD);server:(`S01`S02`S01`S02)];volume:(20;10;30;50))
q)t
sym    server| volume
-------------| ------
EURUSD S01   | 20    
EURUSD S02   | 10    
AUDUSD S01   | 30    
AUDUSD S02   | 50    

我需要对其进行反规范化以很好地显示数据。结果表应如下所示:

sym   | S01 S02
------| -------
EURUSD| 20  10 
AUDUSD| 30  50

如何使用服务器列中的不同值作为新表的列名来动态转换原始表?

谢谢!

【问题讨论】:

    标签: kdb


    【解决方案1】:

    基本上你想要'数据透视'表。以下页面为您的问题提供了很好的解决方案: http://code.kx.com/q/cookbook/pivoting-tables/

    以下是获取所需表的命令:

      q) P:asc exec distinct server from t
      q) exec P#(server!volume) by sym:sym from t
    

    【讨论】:

    • 太棒了!谢谢拉胡尔!
    【解决方案2】:

    关于透视表的一个棘手的事情是 - 字典的键应该是 type symbol 否则它不会生成透视表结构。

    例如在下表中,我们有一列dt,其中typedate

    t:([sym:(`EURUSD`EURUSD`AUDUSD`AUDUSD);dt:(0 1 0 1+.z.d)];volume:(20;10;30;50))
    

    现在,如果我们想用列作为日期来旋转它,它将生成如下结构:

    q)P:asc exec distinct dt from t
    q)exec P#(dt!volume) by sym:sym from t
    (`s#flip (enlist `sym)!enlist `s#`AUDUSD`EURUSD)!((`s#2018.06.22 2018.06.23)!30j, 50j;(`s#2018.06.22 2018.06.23)!20j, 10j)
    

    要将日期作为列,必须将dt 列强制转换为symbol

    show P:asc exec distinct `$string date from t
    `s#`2018.06.22`2018.06.23
    
    q)exec P#((`$string date)!volume) by sym:sym from t
    sym   | 2018.06.22 2018.06.23
    ------| ---------------------
    AUDUSD| 30         50
    EURUSD| 20         10
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-10-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-03-02
      • 1970-01-01
      • 1970-01-01
      • 2014-08-16
      相关资源
      最近更新 更多