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

时间:2019-12-06 08:59:43

标签: group-by kdb

说我有下表:

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 

如何在n列中删除前travel个观察值(假设它们不是从2019.12.06开始的所有内容)?

例如,在该特定示例中,如果为n=1,我将仅获得date> 2019.12.06的条目。

3 个答案:

答案 0 :(得分:2)

我将使用以下代码段:

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

在上面的语句中,所有行号均按行程分组,并且其中的前n个已删除。如果{last[y]^y@x-1}[n]大于组中的行数,则n返回第n个行号或最后一个行号。

答案 1 :(得分:2)

在数据不一定按日期进行排序的情况下,以下内容将起作用(由action="{{ route('update_post', ['id' => $post->id]) }}提供):

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
...

答案 2 :(得分:1)

我会利用简单的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