2013-12-03 27 views
5

Mi piacerebbe calcolare una nuova colonna che è una funzione di più colonne utilizzando select.Passare più argomenti a una funzione all'interno di select

La mia applicazione effettiva coinvolgerà un raggruppamento nella selezione in modo che le voci di colonne che passerò alla funzione conterranno le liste. Ma questo semplice esempio illustra la mia domanda

t:([] a:1 2 3; b:10 20 30; c:5 6 7) 

/Pass one argument, using projection (set first two arguments to 1) 
select s:{[x;y;z] x+y+z}[1;1;] each a from t 

/Pass two arguments using each-both (set first arg to 1) 
select s:a {[x;y;z] x+y+z}[1;;]'b from t 

Ora, come posso passare tre o più argomenti?

risposta

7

Ogni' lavorerà in generale, ma è meglio utilizzare le operazioni vettoriali, ove possibile. Qui uso il. operatore per applicare la nostra funzione, \ t volta per volta entrambi i metodi. I memorizzare i loro risultati a R1/R2 per mostrare che sono gli stessi:

q)t:([]a:til n;b:til n;c:til n:1200300) 
q)\t r1:update d:{x+y+z}'[a;b;c] from t 
289 
q)\t r2:update d:{x+y+z} . (a;b;c) from t 
20 
q)r1~r2 
1b 
q)r2 
a b c d 
----------- 
0 0 0 0 
1 1 1 3 
2 2 2 6 
3 3 3 9 
4 4 4 12 
5 5 5 15 
.. 

Cheers, Ryan

1

Il presente modulo funziona in generale

q)t:([]a:til 10;b:til 10;c:til 10) 
q)select d:{x+y+z}'[a;b;c] from t 
d 
-- 
0 
3 
6 
9 
.. 
Problemi correlati