我有这个股票价格表(这里是简化版):
+----------+--------+-------+
| Time | Ticker | Price |
+----------+--------+-------+
| 10:00:00 | A | 5 |
| 10:00:01 | A | 6 |
| 10:00:00 | B | 3 |
+----------+--------+-------+
Run Code Online (Sandbox Code Playgroud)
我想通过Ticker选择具有最大时间的行组,例如
+----------+--------+-------+
| Time | Ticker | Price |
+----------+--------+-------+
| 10:00:01 | A | 6 |
| 10:00:00 | B | 3 |
+----------+--------+-------+
Run Code Online (Sandbox Code Playgroud)
我知道如何在SQL中做到这一点,类似的问题可以在这里找到,但我不知道如何在KDB中优雅地做到这一点.
我有一个选择两次的解决方案:
select first Time, first Ticker, first Price by Ticker from (`Time xdesc select Time, Ticker, Price from table where date=2018.06.21)
Run Code Online (Sandbox Code Playgroud)
有更清洁的解决方案吗?
每当你进行涉及a的双重选择时by,这是一个好的迹象,你可以改为使用fby
q)t:([]time:10:00:00 10:00:01 10:00:00;ticker:`A`A`B;price:5 6 3)
q)
q)select from t where time=(max;time) fby ticker
time ticker price
---------------------
10:00:01 A 6
10:00:00 B 3
Run Code Online (Sandbox Code Playgroud)
Kdb还提供了一种快捷方式,可以在select by没有指定列的情况下随时获取最后一条记录,但这种方法不是一般的或可自定义的
q)select by ticker from t
ticker| time price
------| --------------
A | 10:00:01 6
B | 10:00:00 3
Run Code Online (Sandbox Code Playgroud)