kdb:动态反规范化表(将键值转换为列名)
我有一张这样的桌子:kdb:动态反规范化表(将键值转换为列名),kdb,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
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
我需要对其进行反规范化,以便很好地显示数据。生成的表应如下所示:
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
如何使用服务器列中的不同值作为新表的列名动态转换原始表
谢谢 基本上您需要“透视”表。下面的页面为您的问题提供了一个很好的解决方案: 以下是获取所需表格的命令:
q) P:asc exec distinct server from t
q) exec P#(server!volume) by sym:sym from t
围绕数据透视表的一个棘手问题是-字典的键应该是
类型
符号
,否则它将不会生成数据透视表结构
例如,在下表中,我们有一列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
明亮的谢谢Rahul!