如何将新列添加到 kdb 表的中间?

mmv*_*456 0 kdb

我在 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 之间添加新列,或者我是否必须重建当前表?

ria*_*noc 5

更新会将新列放在最右侧。

您可以使用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)