wj
, wj1
¶
Window join
wj [w; c; t; (q; (f0;c0); (f1;c1))]
wj1[w; c; t; (q; (f0;c0); (f1;c1))]
Where
t
andq
are simple tables to be joined (q
should be sorted`sym`time
with`p#
on sym). Since 4.1t 2023.08.04 ift
is the name of a table, it is updated in place.w
is a pair of lists of times/timestamps, begin and endc
are the names of the common columns, syms and times, which must have integral typesf0
,f1
are aggregation functions applied to values in q columnsc0
,c1
over the intervals
returns for each record in t
, a record with additional columns c0
and c1
, which are the results of the aggregation functions applied to values over the matching intervals in w
.
Typically this might be:
wj[w;`sym`time;trade;(quote;(max;`ask);(min;`bid))]
A quote is understood to be in existence until the next quote.
To see all the values in each window, pass the identity function ::
in place of the aggregates
E.g. wj[w;c;t;(q;(::;c0);(::;c1))]
Multi-column arguments¶
Since 3.6 2018.12.24, wj
and wj1
support multi-col args, forming the resulting column name from the last argument e.g.
wj[w; f; t; (q; (wavg;`asize;`ask); (wavg;`bsize;`bid))]
Interval behavior¶
wj
and wj1
are both [] interval, i.e. they consider quotes ≥beginning and ≤end of the interval.
For wj
, the prevailing quote on entry to the window is considered valid as quotes are a step function.
wj1
considers quotes on or after entry to the window. If the join is to consider quotes that arrive from the beginning of the interval, use wj1
.
Behavior prior to V3.0
Prior to V3.0, wj1
considered only quotes in the window except for the window end (i.e. quotes ≥start and <end of the interval).
version | wj1 | wj |
---|---|---|
3.0+ | [] |
prevailing + [] |
2.7/2.8 | [) |
prevailing + [] |
q)t:([]sym:3#`ibm;time:10:01:01 10:01:04 10:01:08;price:100 101 105)
q)t
sym time price
------------------
ibm 10:01:01 100
ibm 10:01:04 101
ibm 10:01:08 105
q)a:101 103 103 104 104 107 108 107 108
q)b:98 99 102 103 103 104 106 106 107
q)q:([]sym:`ibm; time:10:01:01+til 9; ask:a; bid:b)
q)q
sym time ask bid
--------------------
ibm 10:01:01 101 98
ibm 10:01:02 103 99
ibm 10:01:03 103 102
ibm 10:01:04 104 103
ibm 10:01:05 104 103
ibm 10:01:06 107 104
ibm 10:01:07 108 106
ibm 10:01:08 107 106
ibm 10:01:09 108 107
q)f:`sym`time
q)w:-2 1+\:t.time
q)wj[w;f;t;(q;(max;`ask);(min;`bid))]
sym time price ask bid
--------------------------
ibm 10:01:01 100 103 98
ibm 10:01:04 101 104 99
ibm 10:01:08 105 108 104
The interval values may be seen as:
q)wj[w;f;t;(q;(::;`ask);(::;`bid))]
sym time price ask bid
--------------------------------------------------
ibm 10:01:01 100 101 103 98 99
ibm 10:01:04 101 103 103 104 104 99 102 103 103
ibm 10:01:08 105 107 108 107 108 104 106 106 107
Window joins with multiple symbols should be used only with a `p#sym
like schema.
Typical RTD-like `g#
gives undefined results.
Window join is a generalization of as-of join
An as-of join takes a snapshot of the current state, while a window join aggregates all values of specified columns within intervals.
aj
,
asof
Joins
Q for Mortals
§9.9.9 Window Joins