从 table 中按组删除前 n 个元素

Remove first n elements by group from table

假设我有以下 table:

t:([]date:25#(.z.d+ til 5); travel:(5#`car),(5#`plane),(5#`bus),(5#`cycle),(5#`scooter); val:25?100)

date       travel  val
----------------------
2019.12.06 car     75 
2019.12.07 car     47 
2019.12.08 car     70 
2019.12.09 car     32 
2019.12.10 car     86 
2019.12.06 plane   29 
2019.12.07 plane   96 

如何删除 travel 列的第一个 n 观察结果(假设它们并非全部从 2019.12.06 开始)?

例如,在那个特定的例子中,如果 n=1,我只会得到日期>2019.12.06.

的条目

我会使用以下代码片段:

n: 3;
select from t where i>({last[y]^y@x-1}[n];i) fby travel

在上面的语句中,所有行号都按行程分组,其中第一个 n 被删除。 {last[y]^y@x-1}[n] returns nth rownum 值或最后一个 rownum,如果 n 大于组中的行数。

在数据不一定按日期 排序 的情况下,下面的方法(由 iasc 提供)有效:

q)select from t where 0<(iasc;date) fby travel
date       travel  val
----------------------
2019.12.07 car     30 
2019.12.08 car     75 
2019.12.09 car     61 
2019.12.10 car     56 
2019.12.07 plane   46
...

按照您的描述包装在一个函数中:

q){[tbl;skipNum]select from tbl where (skipNum-1)<(iasc;date) fby travel}[t;1]
date       travel  val
----------------------
2019.12.07 car     30 
2019.12.08 car     75 
2019.12.09 car     61 
2019.12.10 car     56 
2019.12.07 plane   46
...

我会利用简单的 by 子句。我们可以很容易地通过旅行得到行的索引

q)exec i by travel from t
bus    | 10 11 12 13 14
car    | 0  1  2  3  4
cycle  | 15 16 17 18 19
plane  | 5  6  7  8  9
scooter| 20 21 22 23 24

由此我们可以删除 n 结果,清除索引并重新索引

q)n:1
q)t asc raze value exec _\:[n;]i by travel from t
date       travel  val
----------------------
2019.12.07 car     10
2019.12.08 car     1
2019.12.09 car     90
2019.12.10 car     73
2019.12.07 plane   43
2019.12.08 plane   90
2019.12.09 plane   84
2019.12.10 plane   63
2019.12.07 bus     54
2019.12.08 bus     38
2019.12.09 bus     97
2019.12.10 bus     88
2019.12.07 cycle   68
2019.12.08 cycle   45
2019.12.09 cycle   2
2019.12.10 cycle   39
2019.12.07 scooter 49
2019.12.08 scooter 82
2019.12.09 scooter 40
2019.12.10 scooter 88