【问题标题】:Case When statement for KDBKDB 的 Case When 语句
【发布时间】:2020-08-21 01:37:48
【问题描述】:

对sql语句再熟悉一点——有这个VENUE列表。该列包含 NYSE、NASDAQ、CBOE 等字符串。我想创建一个新列,在其中根据 VENUE 值对其进行定义。

所以我会在 SQL 中声明 -

select VENUE, 
Case when VENUE = 'NYSE' then 'Primary'
when VENUE <> 'NYSE then 'NotPrimary'
else VENUE end as VenueType 
from data

如何在 kdb 中实现这一点?非常感谢任何指导。

【问题讨论】:

    标签: sql kdb


    【解决方案1】:

    我不熟悉 SQL 语法,但对于您的情况,您应该可以像这样使用 vector conditional operator

     q)show t:([]VENUE:`NYSE`NYSE`ASX`NZX`TKO)
    VENUE
    -----
    NYSE
    NYSE
    ASX
    NZX
    TKO
    q)update VENUETYPE:?[`NYSE=VENUE;`Primary;`NotPrimary] from t
    VENUE VENUETYPE
    ----------------
    NYSE  Primary
    NYSE  Primary
    ASX   NotPrimary
    NZX   NotPrimary
    TKO   NotPrimary
    

    【讨论】:

    • 谢谢。我会设置 q)update VENUETYPE:?[NYSE=VENUE;ASX=VENUE; .... Primary;`NotPrimary] from t 如果我想更明确地定义?
    • 没问题,你可以这样做:update VENUETYPE:?[max `ASX`NYSE=\:VENUE;`Primary;`NotPrimary] from t如果你想指定更多的主要交易所
    • 知道了!如果我可以再问一个更明确的问题,如果值为 Null 或空白,我不希望它解析为 `NotPrimary ... 最好的选择是什么?
    • update VENUETYPE:?[max `ASX`NYSE=\:VENUE;`Primary;`NotPrimary] from t where not null VENUE
    【解决方案2】:

    正如 Michael 所指出的,当您有少量结果值(primary/notPrimary)时,向量条件将起作用。在更一般的情况下,您可能有许多结果值,那么您可能会更好地使用字典来重新映射这些值。

    d:`NYSE`ASX`NZX`TKO!`case1`case2`case2`case3;
    q)update VenueType:d[VENUE] from t
    VENUE VenueType
    ---------------
    NYSE  case1
    NYSE  case1
    ASX   case2
    NZX   case2
    TKO   case3
    

    您可以将未映射的查找留空

    q)d:`NYSE`ASX!2#`primary
    q)update VenueType:d[VENUE] from t
    VENUE VenueType
    ---------------
    NYSE  primary
    NYSE  primary
    ASX   primary
    NZX
    TKO
    

    或用默认值填充它们

    q)update VenueType:`notPrimary^d[VENUE] from t
    VENUE VenueType
    ----------------
    NYSE  primary
    NYSE  primary
    ASX   primary
    NZX   notPrimary
    TKO   notPrimary
    

    【讨论】:

      【解决方案3】:

      如果需要,您也可以嵌套条件,即:

      select VENUE, 
          type:
              ?[VENUE = `NYSE; `$"New York";
              ?[VENUE = `NSDQ; `Nasdaq;
                  `Other]]
      from data
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-12-10
        • 2016-07-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-04-10
        相关资源
        最近更新 更多