加入使用场景
Join usage scenarios
官方docs只介绍了join的基本用法。但是可以看到左连接 lj
是如何实现的:
q)lj
k){.Q.ft[,\:[;y];x]}
q).Q.ft
k){$[$[99h=@t:v y;98h=@. t;0];[n:#+!y;n!x 0!y];x y]}
所以可以找到另一个用例 (dict,keyed table)
:
/(dict,dict): add columns
d1: `a`b ! 1 2
d2: `b`c! 3 4
(d1,d2)~`a`b`c! 1 3 4
/(table,table): add rows
t1:(enlist `a`b!1 2)
t2:(enlist `a`b!3 4)
(t1,t2) ~ (`a`b!1 2;`a`b!3 4)
/(keyed table,keyed table): add rows
k1:(`a`b!1 2;`a`b!3 5)!(`c`d`e!10 20 30;`c`d`e!40 50 60)
k2:(`a`b!1 2;`a`b!3 4)!(`c`d`e!15 25 35;`c`d`e!45 55 65)
(k1,k2)
/ a b| c d e
/ ---| --------
/ 1 2| 15 25 35
/ 3 5| 40 50 60
/ 3 4| 45 55 65
/(dict,keyed table): add cols
k2:(`a`b!1 2;`a`b!3 4)!(`c`d`e!15 25 35;`c`d`e!45 55 65)
/ a b| c d e
/ ---| --------
d1: `a`b`c`d !1 2 10 20
/ 1 2| 15 25 35
/ 3 4| 45 55 65
(d1,k2)~`a`b`c`d`e!1 2 15 25 35
文档中也提到了 ,\:
和 ,'
的情况。但是知道表格是变相的字典列表,它们只是上面列出的那些的派生词。
问题是 - 这个强大的函数 join ,
是否还有其他用例(具有不同的参数类型)?
您已经涵盖了 q 中的主要数据结构,但我认为还有一种方法最初对新用户可能并不明显,即给定函数首先是 q 中的 class 个对象,您可以使用 join on它们,这对于创建解析树很有用。
例如,
t:([]col1:10?10;col2:10?10;col3:10?10)
假设您正在使用一个函数查询,并且您想要 select 分别计算 col1 和 col2 的总和,您可以这样写
?[t;();0b;`col1`col2!((sum;`col1);(sum;`col2))]
虽然稍微更紧凑,但包含的列越多,它就会变得越紧凑
?[t;();0b;`col1`col2!sum,/:`col1`col2]
下面又更短了,但不是因为使用了连接
?[t;();0b;{x!sum,/:x}`col1`col2]
官方docs只介绍了join的基本用法。但是可以看到左连接 lj
是如何实现的:
q)lj
k){.Q.ft[,\:[;y];x]}
q).Q.ft
k){$[$[99h=@t:v y;98h=@. t;0];[n:#+!y;n!x 0!y];x y]}
所以可以找到另一个用例 (dict,keyed table)
:
/(dict,dict): add columns
d1: `a`b ! 1 2
d2: `b`c! 3 4
(d1,d2)~`a`b`c! 1 3 4
/(table,table): add rows
t1:(enlist `a`b!1 2)
t2:(enlist `a`b!3 4)
(t1,t2) ~ (`a`b!1 2;`a`b!3 4)
/(keyed table,keyed table): add rows
k1:(`a`b!1 2;`a`b!3 5)!(`c`d`e!10 20 30;`c`d`e!40 50 60)
k2:(`a`b!1 2;`a`b!3 4)!(`c`d`e!15 25 35;`c`d`e!45 55 65)
(k1,k2)
/ a b| c d e
/ ---| --------
/ 1 2| 15 25 35
/ 3 5| 40 50 60
/ 3 4| 45 55 65
/(dict,keyed table): add cols
k2:(`a`b!1 2;`a`b!3 4)!(`c`d`e!15 25 35;`c`d`e!45 55 65)
/ a b| c d e
/ ---| --------
d1: `a`b`c`d !1 2 10 20
/ 1 2| 15 25 35
/ 3 4| 45 55 65
(d1,k2)~`a`b`c`d`e!1 2 15 25 35
文档中也提到了 ,\:
和 ,'
的情况。但是知道表格是变相的字典列表,它们只是上面列出的那些的派生词。
问题是 - 这个强大的函数 join ,
是否还有其他用例(具有不同的参数类型)?
您已经涵盖了 q 中的主要数据结构,但我认为还有一种方法最初对新用户可能并不明显,即给定函数首先是 q 中的 class 个对象,您可以使用 join on它们,这对于创建解析树很有用。
例如,
t:([]col1:10?10;col2:10?10;col3:10?10)
假设您正在使用一个函数查询,并且您想要 select 分别计算 col1 和 col2 的总和,您可以这样写
?[t;();0b;`col1`col2!((sum;`col1);(sum;`col2))]
虽然稍微更紧凑,但包含的列越多,它就会变得越紧凑
?[t;();0b;`col1`col2!sum,/:`col1`col2]
下面又更短了,但不是因为使用了连接
?[t;();0b;{x!sum,/:x}`col1`col2]