日付、sym、およびサイズを列として持つテーブルがあるとします。日付は昇順、サイズは日付ごとに降順です。各日付の上位数件、たとえば 10 件のレコードのみが保持されるように、テーブルを要約するにはどうすればよいですか? コマンドは単純であるほどよい。
前もって感謝します!
日付、sym、およびサイズを列として持つテーブルがあるとします。日付は昇順、サイズは日付ごとに降順です。各日付の上位数件、たとえば 10 件のレコードのみが保持されるように、テーブルを要約するにはどうすればよいですか? コマンドは単純であるほどよい。
前もって感謝します!
与えられたテーブル:
q)show tbl:`date`val!/:(.z.d+til 3) cross 100+til 25;
date val
--------------
2016.10.31 100
2016.10.31 101
2016.10.31 102
2016.10.31 103
2016.10.31 104
..
日付で最初の N 行を選択: (以下の例では N=2)
q)select from tbl where i in{raze y sublist/:group x}[date;2]
date val
--------------
2016.10.31 100
2016.10.31 101
2016.11.01 100
2016.11.01 101
2016.11.02 100
2016.11.02 101
関数を使用group
- 各一意の値が発生するインデックスを含む辞書を返します。次に、関数は一意の値ごとに最初の N 個のインデックス ( sublist ) を取得します。
注意: i
kdb テーブルの暗黙の行インデックスです。
'fby' も適切なオプションであり、通常、グループの操作/集計が必要な場合に使用されます。
http://code.kx.com/q/ref/qsql/#fby
あなたの例では、テーブルにはすでに各日付の降順で「サイズ」列があるため、上位10行をフェッチすると目的の結果が得られます。
q) select from tbl where ({x in 10#x};i) fby date