-->

KDB+ / Q Syntax optimizations to oneliners

2019-09-04 02:44发布

问题:

I am definitly a q-mortal. I would even say a q-baby. Well I have some question how to put together my code from separate lines to a one-liner. I guess there is a way more elegant solution than mine.

  1. How to write the following statements in one line:

    q)t1:(3#3)?\:`8
    q)t1[;0]:`abc
    
  2. In this table creation, how can I add another column which I have as list (like with the command ([]id:id_list;data:data_list;.....)). Till now I am creating another table and doing an inner join on them. I guess that's not very efficient:

    `id xkey update id:i from flip (`row1`row2!(1 2;3 4))
    

回答1:

For the 1st one you may do:

q)`abc,/:(3#2)?\:`8
abc jognjhck cihanjhp
abc hkpblald aeajbddp
abc blmjhgah ooeiogdj

For 2nd one you may treat the table as a dictionary:

q)tb
row1 row2
---------
1    3   
2    4   
q)(tb`id): 5 6
q)tb
row1 row2 id
------------
1    3    5 
2    4    6 


回答2:

  1. Two options:-
    Create a 3*2 matrix of random symbols and append `abc in front.

    q)`abc,/:(3#2)?\:`8
    

Or create 3*3 matrix of random symbols and use functional form of amend to update the first column. This is a more generic approach.

    q).[(3#3)?\:`8;(::;0);:;`abc]
  1. I don't see any problem with using just update statement.

    q)c:1 2  
    q)t  
    row1 row2  
    ---------  
    1    3  
    2    4  
    q)update newCol:c from `t  
    `t  
    q)t  
    row1 row2 newCol  
    ----------------  
    1    3    1  
    2    4    2