2016-05-16 3 views
1

Hier ist mein Problem:KDB, wie mit dem ersten Zeitpunkt des Erscheinens aj

Ich habe zwei Tabellen:

q)t1:([]sym:1 5;x: 90 90) 
q)t2:([]sym: 2 3 4 6 7 8; y: 100 200 300 400 500 600) 

Wenn ich aj[`sym;t2;t1] tun, werden alle sechs Spalten in der Ergebnistabelle enthält x mit dem Wert 90.

Aber was ich will, ist Wert 90 in der Spalte in der Zeile nur mit sym 2 und 6, dh das erste Mal, dass sym in Tabelle x t2 vor Tabelle erscheinen t1.

Mit anderen Worten, ich mag die Ergebnistabelle so sein:

q)([]sym:2 3 4 6 7 8; y: 100 200 300 400 500 600; x:90 0N 0N 90 0N 0N) 
sym y x 
---------- 
2 100 90 
3 200 
4 300 
6 400 90 
7 500 
8 600 

Könnte mir jemand sagen, wie ich das erreichen kann? Ich danke dir sehr!

Antwort

1

Nicht sicher, ob aj in diesem Sinne verwendet werden kann. Das könnte Sie geben, was Sie brauchen:

q)t2 lj 1!update sym:{x x binr y}[t2.sym;sym] from t1 
sym y x 
---------- 
2 100 90 
3 200 
4 300 
6 400 90 
7 500 
8 600 

BINR Verwendet der nächste Wert größer als der Wert in t1 zu finden, dann schließt sich nur darauf.

EDIT: Beachten Sie auch, dass BINR ist> = ..... Wenn Sie streng größer ist als Sie nutzen könnten:

q)t2 lj 1!update sym:{x 1+x bin y}[t2.sym;sym] from t1 
sym y x 
---------- 
2 100 90 
3 200 
5 300 
6 400 90 
7 500 
8 600 
0

Sie können aj tun, den Index zu erhalten, wo nächste kleinere Anzahl von x wird hineinpassen, dann eine Vektorbedingung, um x zu erhalten, wenn der Index inkrementiert wurde, dh

select sym, y, x:?[c>prev c;x;0n] from aj[`sym; t2; update c:i from t1] 
Verwandte Themen