我有一张这样的表:
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
如何使用服务器列中的不同值动态转换原始表作为新表的列名?
谢谢!
答案 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
,其中type
为date
。
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