Search code examples
kdb

HDB table comparision


Posting this question in Q&A-style.

Why boolean match between 2 identical tables (one of them is selected from HDB) generate 0b rather than 1b?

q)trade:trade2:`sym`time xasc ([] sym:5?`apple`google;time:5?.z.t;price:100+5?1.)

q).Q.dpft[`:tmp;.z.d-1;`sym;`trade]
`trade

Load the HDB

\l tmp/
q)hist:select from trade where date=.z.d-1
q)hist
date       sym    time         price   
---------------------------------------
2018.04.23 apple  02:31:39.330 100.2392
2018.04.23 apple  04:25:17.604 100.1508
2018.04.23 apple  07:57:14.764 100.2782
2018.04.23 google 02:59:16.636 100.1567
2018.04.23 google 14:35:31.860 100.9785

q)(`date xcols update date:.z.d-1 from trade2)
date       sym    time         price   
---------------------------------------
2018.04.23 apple  02:31:39.330 100.2392
2018.04.23 apple  04:25:17.604 100.1508
2018.04.23 apple  07:57:14.764 100.2782
2018.04.23 google 02:59:16.636 100.1567
2018.04.23 google 14:35:31.860 100.9785

Table comparison generates false(0b)

q)(`date xcols update date:.z.d-1 from trade2)~hist
0b

Solution

  • The mismatch is due to the type of sym column (20h) of the table selected from HDB.

    \l tmp/
    q)hist:select from trade where date=.z.d-1
    q)type exec sym from hist
    20h
    q)type exec sym from trade2
    11h
    q)type exec value sym from hist
    11h
    

    Though it looks exactly like symbol but has a new type 20h, something similar to the following (from Kx wiki)

    q)type `city$10?city:`london`paris`rome
    21h
    

    Using value with sym to get the desired result:

    q)(`date xcols update date:.z.d-1 from trade2)~update value sym from hist
    1b