我在 kdb/Q 中有一个表,如下所示:
table_a:([] Symbol:`X`Y`Z; StartDate:2023.09.01 2023.09.02 2023.09.03;Name:`Maria`Sam`Sydney);
Run Code Online (Sandbox Code Playgroud)
它给了我一个看起来像这样的表:
| 象征 | 开始日期 | 姓名 |
|---|---|---|
| X | 2023.09.01 | 玛丽亚 |
| 是 | 2023.09.02 | 山姆 |
| Z | 2023.09.03 | 悉尼 |
我想要的是在 StartDate 和 Name 列之间创建一个新列,因此看起来像这样:
| 象征 | 开始日期 | 结束日期 | 姓名 |
|---|---|---|---|
| X | 2023.09.01 | 2023.09.01 | 玛丽亚 |
| 是 | 2023.09.02 | 2023.09.08 | 山姆 |
| Z | 2023.09.03 | 2023.09.14 | 悉尼 |
我查找了文档,但看起来只有将行附加到表末尾的选项。有没有办法让我在使用 Q 之间添加新列,或者我是否必须重建当前表?
更新会将新列放在最右侧。
您可以使用xcols将列移至左侧。
q)table_a:update EndDate:StartDate+1 from table_a
q)`Symbol`StartDate`EndDate xcols table_a
Symbol StartDate EndDate Name
-----------------------------------
X 2023.09.01 2023.09.02 Maria
Y 2023.09.02 2023.09.03 Sam
Z 2023.09.03 2023.09.04 Sydney
Run Code Online (Sandbox Code Playgroud)
可以编写一个快速函数:
q)moveToRightOf:{c:`,cols[x] except z;((((1+c?y)#c),z) except `) xcols x}
//Move EnDate to right of StartDate
q)moveToRightOf[table_a;`StartDate;`EndDate]
Symbol StartDate EndDate Name
-----------------------------------
X 2023.09.01 2023.09.02 Maria
Y 2023.09.02 2023.09.03 Sam
Z 2023.09.03 2023.09.04 Sydney
//Use ` to move to beginning
q)moveToRightOf[table_a;`;`EndDate]
EndDate Symbol StartDate Name
-----------------------------------
2023.09.02 X 2023.09.01 Maria
2023.09.03 Y 2023.09.02 Sam
2023.09.04 Z 2023.09.03 Sydney
Run Code Online (Sandbox Code Playgroud)
moveToLeftOf非常相似,但使用 ` 移动到末尾
q)moveToLeftOf:{c:cols[x] except z;(((c?y)#c),z) xcols x}
q)moveToLeftOf[table_a;`Name;`EndDate]
Symbol StartDate EndDate Name
-----------------------------------
X 2023.09.01 2023.09.02 Maria
Y 2023.09.02 2023.09.03 Sam
Z 2023.09.03 2023.09.04 Sydney
q)moveToLeftOf[table_a;`Symbol;`EndDate]
EndDate Symbol StartDate Name
-----------------------------------
2023.09.02 X 2023.09.01 Maria
2023.09.03 Y 2023.09.02 Sam
2023.09.04 Z 2023.09.03 Sydney
q)moveToLeftOf[table_a;`;`EndDate]
Symbol StartDate Name EndDate
-----------------------------------
X 2023.09.01 Maria 2023.09.02
Y 2023.09.02 Sam 2023.09.03
Z 2023.09.03 Sydney 2023.09.04
Run Code Online (Sandbox Code Playgroud)