Search code examples
kdbk

Restrict table columns, preserving keys


I've found in "Q Tips" a technique to preserve keys in a table. This is useful for restriction columns in the right table in lj for example, without re-applying a key. Using each:

q)show t:(`c1`c2!1 2;`c1`c2!3 4)!(`c3`c4`c5!30 40 50;`c3`c4`c5!31 41 51)
c1 c2| c3 c4 c5
-----| --------
1  2 | 30 40 50
3  4 | 31 41 51
q)`c3`c4#/:t
c1 c2| c3 c4
-----| -----
1  2 | 30 40
3  4 | 31 41

I’m trying to understand why it preserves a key part of the table t:

q){-3!x}/:t
'/:
  [0]  {-3!x}/:t
              ^

But in this case q doesn’t show how it treats each row of the keyed table.

So why is this syntax #/:t works in such a way for a keyed table? Is it mentioned anywhere in code.kx.com docs?

Upd1: I've found a case with # and keyed table on code.kx.com, but it is about selecting rows, not columns.


Solution

  • If you view the keyed table as a dictionary (which it is) then it's no different to:

    q)2*/:`a`b!1 2
    a| 2
    b| 4
    

    or

    q){x+1} each `a`b!1 2
    a| 2
    b| 3
    

    The keys are retained when applying a function to each element of a dictionary. In your example the function being applied is to use take on a dictionary, e.g:

    q)`c3`c4#first t
    c3| 30
    c4| 40
    

    doing that for each row returns a list of dictionaries which is itself a table.

    Also your other attempt would work as:

    {-3!x}@/:t
    

    so it's not unique to take #