kdb 更新列并根据组执行排序,然后根据日期排名更新另一列

kdb update column and perform a sort based on group and then update another column based on date rank

我下面有一个 table 例如,

  1. 如何按升序对日期进行排序,对于那些我们希望expiration_date按升序排序的日期。
  2. 一旦我们这样做了,我们想将符号系统添加到 sym 列, 所以最近的到期日将表示为 ESc1!然后第二近的是 ESc2!
  3. 我们应该在到期日 - 1 滚动到下一个合约,所以在到期前一天我们将更改 ESc2!将更改为 ESc1!
  date      sym   expiration_date
2021-11-01  ES1!  2021-12-17
2021-11-01  ES2!  2022-03-18
2021-11-01  ES3!  2022-06-17
2021-11-02  ES1!  2021-12-17
2021-11-02  ES2!  2022-03-18
2021-11-02  ES3!  2022-06-17
2021-11-03  ES1!  2021-12-17
2021-11-03  ES2!  2022-03-18
2021-11-03  ES3!  2022-06-17
2021-11-12  ES1!  2021-12-17
2021-11-12  ES2!  2022-03-18
2021-11-12  ES3!  2022-12-16
2021-11-12  ES4!  2022-06-17
2021-11-15  ES1!  2021-12-17
2021-11-15  ES2!  2022-03-18
2021-11-16  ES1!  2021-12-17
2021-11-16  ES2!  2022-03-18
2021-11-16  ES3!  2022-06-17

预期输出

  date      sym   expiration_date
2021-11-01  ES1!  2021-12-17
2021-11-01  ES2!  2022-03-18
2021-11-01  ES3!  2022-06-17
2021-11-01  ESc1!  2021-12-17
2021-11-01  ESc2!  2022-03-18
2021-11-01  ESc3!  2022-06-17
2021-11-02  ES1!  2021-12-17
2021-11-02  ES2!  2022-03-18
2021-11-02  ES3!  2022-06-17
2021-11-02  ESc1!  2021-12-17
2021-11-02  ESc2!  2022-03-18
2021-11-02  ESc3!  2022-06-17
2021-11-03  ES1!  2021-12-17
2021-11-03  ES2!  2022-03-18
2021-11-03  ES3!  2022-06-17
2021-11-03  ESc1!  2021-12-17
2021-11-03  ESc2!  2022-03-18
2021-11-03  ESc3!  2022-06-17
2021-11-12  ES1!  2021-12-17
2021-11-12  ES2!  2022-03-18
2021-11-12  ES3!  2022-12-16
2021-11-12  ES4!  2022-06-17
2021-11-12  ESc1!  2021-12-17
2021-11-12  ESc2!  2022-03-18
2021-11-12  ESc3!  2022-06-17
2021-11-12  ESc4!  2022-12-16
2021-11-15  ES1!  2021-12-17
2021-11-15  ES2!  2022-03-18
2021-11-15  ESc1!  2021-12-17
2021-11-15  ESc2!  2022-03-18
2021-11-16  ES1!  2021-12-17
2021-11-16  ES2!  2022-03-18
2021-11-16  ES3!  2022-06-17
2021-11-16  ESc1!  2021-12-17
2021-11-16  ESc2!  2022-03-18
2021-11-16  ESc3!  2022-06-17

您可以尝试这样的操作:

ungroup select
    sym:{ES:`$"ES",/:string[1+til count?[(.z.d-1)=a 0;1_a;a:asc x]],\:"!";
        ES,`${ssr[string x;"ES";"ESc"]}each ES}expiration_date,
    {raze 2#enlist?[(.z.d-1)=a 0;1_a;a:asc x]}expiration_date
        by date from tbl

编辑:更新任务第 3 部分的代码。

这里的代码按日期先按日期对tbl进行排序,然后使用asc的逻辑expiration_date,我们可以检查第一个到期日期是否等于昨天。如果是这样,我们将其从列表中删除。

对符号列使用相同的检查,我们知道每个日期的 expiration_date 计数,因此我们可以应用我们的 ES* 和 ESc* 函数。