KDB/Q如何转置含多个键的表?求通用解决方案
KDB/Q 转置含多键表的通用解决方案
核心思路
利用pivot函数实现多键表转置:先将多键组合转换为唯一列名,再把原数值列转为行,最终得到目标格式。
步骤与示例
假设已有示例表t(结构与提问中的表一致),具体操作如下:
1. 构造示例表
t:([] x:`today`yesterday`today`yesterday`today`yesterday; y:`setting1`setting1`setting2`setting2`setting1`setting1; z:`model1`model1`model1`model1`model2`model2; ltCt:41.66 -1570.33 41.66 -1570.33 41.66 -1570.33; poPt:367.69 77233.76 367.69 77233.76 367.69 77233.76; kgAg:-662.89 -1169.33 -662.89 -1169.33 -662.89 -1169.33; xoOt:11347.91 11267.63 11347.91 11267.63 11347.91 11267.63; woWa:30644 17079 30644 17079 30644 17079; yTri:-177 5623 -177 5623 -177 5623; zapR:19149.92 31069.08 19149.92 31069.08 19149.92 31069.08)
2. 定义关键列
keyCols:`x`y`z // 多键列 valCols:`ltCt`poPt`kgAg`xoOt`woWa`yTri`zapR // 需要转置的数值列
3. 生成自定义列名(匹配理想输出格式)
将多键的取值拼接为首字母大写的字符串:
// 将键组合元组转换为拼接字符串 formatKey:{raze {upper first x, 1_x} each string each x} newColNames:formatKey each exec distinct flip keyCols from t
4. 转置并调整结构
用pivot生成宽表,再重命名列:
// 生成转置后的基础表 result:pivot[t;keyCols;valCols] // 重命名列,适配目标格式 result:rename `data!valCols, (newColNames)!key[1_ key result]
最终输出
执行后result的结构与理想输出一致:
data TodaySetting1Model1 YesterdaySetting1Model1 TodaySetting2Model1 ... --------------------------------------------------------------------------------- ltCt 41.66 -1570.33 41.66 poPt 367.69 77233.76 367.69 kgAg -662.89 -1169.33 -662.89 xoOt 11347.91 11267.63 11347.91 woWa 30644 17079 30644 yTri -177 5623 -177 zapR 19149.92 31069.08 19149.92
通用适配说明
- 无论键列数量多少,只需修改
keyCols参数,formatKey函数会自动处理任意数量的键拼接。 - 若需调整列名格式(如用下划线分隔),修改
formatKey函数即可,例如:formatKey:{raze "_" join string each x} // 下划线分隔格式
内容的提问来源于stack exchange,提问作者Cole
相关产品推荐
相关产品推荐

