KDB中简化冗长select语句:获取ticker下signal=1非首次行
KDB 优化实现:过滤每个Ticker首次出现的Signal=1行
需求说明
针对每个ticker,筛选出所有signal=1的行,但排除每个ticker中该条件的首次出现。
原实现(正确但冗长)
以下是功能正确但代码繁琐的实现方式:
og:([] ticker:raze 5#/:(`AAPL`GOOGL`MSFT); date:raze 3#enlist 2023.01.01+til 5; price:45 46 47 48 49,100 102 101 103 105,200 201 199 202 205; volume:1000 1100 900 1200 1300,500 520 510 530 550,300 310 290 320 330; signal:0 0 1 1 0,0 1 1 1 0,0 0 0 1 1 / 示例信号数据 ); t:select from og where signal=1; t:update valid:1b from t where date>(min;date) fby ticker; t:select from t where valid; show t: delete valid from t; / 结果正确但代码冗余
示例数据(og表)
q)og ticker date price volume signal ------------------------------------- AAPL 2023.01.01 45 1000 0 AAPL 2023.01.02 46 1100 0 AAPL 2023.01.03 47 900 1 AAPL 2023.01.04 48 1200 1 AAPL 2023.01.05 49 1300 0 GOOGL 2023.01.01 100 500 0 GOOGL 2023.01.02 102 520 1 GOOGL 2023.01.03 101 510 1 GOOGL 2023.01.04 103 530 1 GOOGL 2023.01.05 105 550 0 MSFT 2023.01.01 200 300 0 MSFT 2023.01.02 201 310 0 MSFT 2023.01.03 199 290 0 MSFT 2023.01.04 202 320 1 MSFT 2023.01.05 205 330 1
预期正确结果(t表)
q)t ticker date price volume signal ------------------------------------- AAPL 2023.01.04 48 1200 1 GOOGL 2023.01.03 101 510 1 GOOGL 2023.01.04 103 530 1 MSFT 2023.01.05 205 330 1
简洁高效的优化写法
写法一:单步过滤(推荐)
直接在where子句中结合fby分组筛选,一步到位:
select from og where signal=1, date>(min;date) fby ticker
原理:先筛选所有signal=1的行,再针对每个ticker,保留date大于该分组下最小date(即首次出现signal=1的日期)的行,自动排除首次出现的记录。
写法二:基于行索引的过滤
先过滤出所有signal=1的行,再通过行索引排除每个分组的首行:
select from (select from og where signal=1) where i>first i fby ticker
原理:对每个ticker分组,保留行索引i大于该分组首行行索引的记录,直接排除首次出现的行。
错误写法分析
以下写法结果不符合预期,原因是逻辑错误:
q) select by ticker from og where date>date[first where signal=1] / 错误实现 ticker| date price volume signal ------| ------------------------------ AAPL | 2023.01.05 49 1300 0 GOOGL | 2023.01.05 105 550 0 MSFT | 2023.01.05 205 330 1
问题点:
select by ticker是分组聚合操作,会返回每个ticker的单条聚合结果,而非所有符合条件的行;date[first where signal=1]是全局查找首次出现signal=1的日期,而非按ticker分组查找,导致筛选逻辑完全错误。
内容的提问来源于stack exchange,提问作者marital_weeping
相关产品推荐
相关产品推荐

