如何删除 QSQL 中 last 关键字的冗余使用



我有一个表格:

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 短语与不选择列一起使用与将最后应用于所有列相同。

select by sym from t

应该做这个技巧

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

解决此问题的常见方法是使用fby,它允许您在所有列中应用firstlast(或 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

最新更新