2017-11-23 9 views
2

次のレコードのインデックスを格納するある種のデータに加えてn列を持つテーブルがあります。たとえば、レコードの順番を回復する

q)show t:([]x:"cbad";n:3 0 1 4) 
x n 
--- 
c 3 
b 0 
a 1 
d 4 

この情報からレコードの順序を復元する方法を探しています。正しい順序上記の例でabcdnカラムはcbab続いて、c続いて、dが続いていることを教えてくれる、そしてdは、最後のレコード(nで範囲指標のうちに注意していますカラム)。

q)select x,next_x:x n from t 
x next_x 
-------- 
c d 
b c 
a b 
d 

最後のレコードはいつも最後に来ており、アルゴリズムはこれを仮定しています。

[EDIT]

ここに私が思い付いたワンライナーです:私は

t exec n\[-1+count i;first i except n]from t 

:オフィスで

q)t exec n\[-1+count n;]first where @[(1+count n)#1b;n;:;0b] from t 
x n 
--- 
a 1 
b 0 
c 3 
d 4 

答えて

0

誰かがあなたのソリューションの簡素化を思い付い上記のものよりも速いわけではありませんが、次の文字が正しい順序になるように定義する辞書を使用しています:

{a:-1_r\[key[r]except value r:x[`x]!x[`x]x`n];x a?/:x`x}t 
x n 
--- 
a 1 
b 0 
c 3 
d 4 

よろしく、あなたのような何かを行うことができ、あなたの仮定で
トーマス・スミス
AquaQ解析

+0

私は自分のソリューションをやや簡略化しました。現実的なテストケースでは、あなたのソリューションより約10%速くなっています。 –

1

t exec -2_n\[first i except n] from t 

は約30%であなたの例をスピードアップし、もう少しエレガント私は思う:-)

マット

+1

これまでに見たことがない人なら、TrevanableのStevan Apterの記事はかなり面白いかもしれません(http://archive.vector.org.uk/art10500340)。 –

+0

リンクをありがとう。とても興味深い。残念なことに、私が大きなテストケースであなたのソリューションを試したとき、私は ''ループ 'エラーを受け取りました。 –

+1

使用しているテストケース/データセットのサイズはどれくらいですか? –

関連する問題