Kdb 如何消除qsql中最后一个关键字的重复使用

Kdb 如何消除qsql中最后一个关键字的重复使用,kdb,Kdb,我有一张桌子: q)t:([] sym:`AAPL`MSFT`AMZN`AAPL`MSFT`AMZN; px:1 2 3 11 22 33; sh:100 200 300 1000 2000 3000) 我想通过sym获得最后一个px和sh,可以使用最后一个函数两次获得: q)select last px, last sh by sym from t sym | px sh ----| ------- AAPL| 11 1000 AMZN| 33 3000 MSFT| 22 2000 我们如

我有一张桌子:

q)t:([] sym:`AAPL`MSFT`AMZN`AAPL`MSFT`AMZN; px:1 2 3 11 22 33; sh:100 200 300 1000 2000 3000)
我想通过sym获得最后一个px和sh,可以使用最后一个函数两次获得:

q)select last px, last sh by sym from t
sym | px sh
----| -------
AAPL| 11 1000
AMZN| 33 3000
MSFT| 22 2000
我们如何只使用last关键字一次就可以得到上面的输出?因为在实际情况下,有时我们需要在30多列上使用last

我失败的尝试:

q)select last (px;sh) by sym from t
q)select {last x}@'(px;sh) by sym from t

对于这种情况,在不选择列的情况下使用by短语与将last应用于所有列相同

select by sym from t
我们应该这样做

q)(select last px, last sh by sym from t)~select by sym from t
1b

解决此问题的一种常见方法是使用fby,它允许您在所有列上应用诸如first或last或lambda之类的函数:

t:([]c1:10?`A`B`C;c2:10?10;c3:10?"xyz";c4:.z.D-til 10)

q)select from t where i=(last;i)fby c1
c1 c2 c3 c4
-------------------
A  9  z  2019.10.01
C  7  y  2019.09.29
B  0  x  2019.09.28

q)select from t where i=({first x};i)fby c1
c1 c2 c3 c4
-------------------
B  6  x  2019.10.07
C  6  x  2019.10.06
A  4  y  2019.10.02
要在注释中回答您关于在每列中应用不同函数的问题,您必须使用函数选择,例如:

q)?[t;();{x!x}1#`c1;{x!((first;last)x in `c2`c4),'x}cols[t]except`c1]
c1| c2 c3 c4
--| ----------------
A | 9  y  2019.10.01
B | 0  x  2019.09.28
C | 7  x  2019.09.29

这对c2和c4列使用last,然后对其他列使用first

如果我们必须从表中获取100列,则从该表中获取-对于25列,我们需要最后一个值,对于15列,我们需要第一个值,那么如何才能做到这一点?您可以执行以下操作:选择last@/:col1;col2,first@/:col3;如果已知表在时间上是单调的,这是给定问题的最佳解决方案。它是最简洁的,并且会运行很多faster@Utsav我认为特里的答案是最好的方法,如果你想在你的专栏中应用除最后一篇以外的任何东西。