kdb:动态地对表进行非规范化(将键值转换为列名)

时间:2015-07-13 12:11:13

标签: kdb

我有一张这样的表:

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

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

谢谢!

2 个答案:

答案 0 :(得分:3)

基本上你想要'pivot'表。以下页面为您的问题提供了非常好的解决方案: 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

答案 1 :(得分:0)

围绕表旋转的一个棘手的事情是-字典的键应该是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