uj
首发版本:3.00.6
语法
uj(leftTable, rightTable, matchingCols, [rightMatchingCols])
详情
按指定列对两张普通内存表执行 union join,并返回合并后的内存表。
该操作兼容 kdb+ 的 uj:
-
以左表为基础,根据 matchingCols 进行等值匹配。
-
匹配记录由右表更新,右表中的非 matchingCols 的列值覆盖左表同名列;右表中未匹配的记录追加到结果表末尾。
-
结果表包含左右表的列并集,缺失字段填充空值。
-
当 matchingCols 与 rightMatchingCols 不一致时,结果表仅保留 matchingCols(左表匹配列)。
注意:该函数当前仅支持普通内存表,不支持 DFS 表、分区表、流表等其他表对象。
参数
leftTable 一个普通内存表,表示左表。
rightTable 一个普通内存表,表示右表。
matchingCols 字符串标量或向量,左边列名,表示匹配列。若为多个列名,则这些列共同组成匹配键。指定的列必须存在于 leftTable 中。
rightMatchingCols 可选参数,字符串标量或向量,表示右表匹配列名。当左右表匹配列名不一致时,必须指定。指定的列必须存在于 rightTable 中,且长度必须与 matchingCols 一致。未指定时,默认使用与 matchingCols 相同的列名在右表中匹配。
注意:
-
leftTable 中按 matchingCols 形成的 key 必须唯一,rightTable 中按 rightMatchingCols 形成的 key 也必须唯一;同一个 key 在单张表中只能出现一行。若未指定 rightMatchingCols,则 rightTable 按 matchingCols 形成的 key 必须唯一。
-
matchingCols 中的 NULL 匹配行为受 enableNullSafeJoin 控制。默认
enableNullSafeJoin=false,NULL 不匹配;将其设置为 true 后,NULL 将视为相等进行匹配。
返回值
常规内存表。
例子
例 1. 右表覆盖左表已有记录,仅一个匹配列,且左右表匹配列名称相同。
t1 = table(`a`b as sym, 10 20 as px)
t2 = table(`b`c as sym, 99 30 as px)
uj(leftTable=t1, rightTable=t2, matchingCols="sym")
| sym | px |
|---|---|
| a | 10 |
| b | 99 |
| c | 30 |
例 2. 匹配列中,右表值与左表值不相同。
t1 = table(`a`b as sym, 10 20 as px)
t2 = table(`c as sym, 300 as qty)
uj(leftTable=t1, rightTable=t2, matchingCols="sym")
| sym | px | qty |
|---|---|---|
| a | 10 | |
| b | 20 | |
| c | 300 |
例 3. 默认情况下,匹配列中的 NULL 不匹配。
t1 = table(int([NULL, 1]) as id, 10 20 as v)
t2 = table(int([NULL, 2]) as id, 99 30 as v)
uj(leftTable=t1, rightTable=t2, matchingCols="id")
| id | v |
|---|---|
| 10 | |
| 1 | 20 |
| 99 | |
| 2 | 30 |
设置 enableNullSafeJoin 为 true,匹配列中的 NULL 视为匹配。
setDynamicConfig("enableNullSafeJoin", true)
uj(leftTable=t1, rightTable=t2, matchingCols="id")
| id | v |
|---|---|
| 99 | |
| 1 | 20 |
| 2 | 30 |
例 4. 左右表匹配列名不同
t1 = table(1 2 as id, 10 20 as px)
t2 = table(2 3 as rid, 99 30 as px)
uj(leftTable=t1, rightTable=t2, matchingCols="id", rightMatchingCols="rid")
| id | px |
|---|---|
| 1 | 10 |
| 2 | 99 |
| 3 | 30 |
例 5. 指定多个匹配列
t1 = table(
`AAPL`AAPL`MSFT`MSFT as sym,
`NASDAQ`NYSE`NASDAQ`NYSE as exch,
180.5 181.0 320.1 321.0 as px,
1000 1200 800 900 as vol
)
t2 = table(
`AAPL`MSFT`GOOG`MSFT as sym,
`NASDAQ`NASDAQ`NASDAQ`CBOE as exch,
182.0 319.5 140.0 322.0 as px,
1500 850 600 950 as vol
)
uj(
leftTable=t1,
rightTable=t2,
matchingCols=["sym", "exch"]
)
| sym | exch | px | vol |
|---|---|---|---|
| AAPL | NASDAQ | 182 | 1,500 |
| AAPL | NYSE | 181 | 1,200 |
| MSFT | NASDAQ | 319.5 | 850 |
| MSFT | NYSE | 321 | 900 |
| GOOG | NASDAQ | 140 | 600 |
| MSFT | CBOE | 322 | 950 |
