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!