从 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 n
th 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
假设我有以下 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 n
th 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