求教!NOT IN 在集算器中如何实现
集算器中有两个 query 单元格,分别是计算数据集 a 和 b
要计算
1)a inner join b
2)a. 某字段 not in (select 某字段 from b)。
3)将 1 和 2 的结果 union all 起来。
请问 2)中的 not in 在计算器中如何实现呢?我的写法是,A3.select(a. 某字段 not in D7),D7 是 D3.select(b. 某字段),提示这样写不对,求教!
"集算器中有两个 query 单元格,分别是计算数据集 a 和 b 要计算 1)a inner join b 2)a. 某字段 not in (select 某字段 from b)。 3)将 1 .."
集算器中有两个 query 单元格,分别是计算数据集 a 和 b
要计算
1)a inner join b
2)a. 某字段 not in (select 某字段 from b)。
3)将 1 和 2 的结果 union all 起来。
请问 2)中的 not in 在计算器中如何实现呢?我的写法是,A3.select(a. 某字段 not in D7),D7 是 D3.select(b. 某字段),提示这样写不对,求教!
或者写成 a left join b on 连接字段 然后 select a. 连接字段 ==null?
D3.select(A3.(A3 字段).contain(D3 字段)),这个是取在 A3 中的值,然后加个取非就行:
D3.select(!(A3.(A3 字段).contain(D3 字段)))
非常感谢,明白了,A3.select(!D3.(col).contain(col))。再请教一个问题可以吗,有个动态参数是:cpbh1=if(cpbh==null,“1=1”,“prod_cd=’”+cphb+“’”),也就是根据传入的 cpbh 来确定 where 的条件。我的写法是,单元格 D22 中直接写 =cpbh1,
然后 select(D22),这种写法有问题吗?实际上这个 select(D22) 没有起作用
这个可以用宏替换或者 eval 来实现
比如:=D21.select(${D22})
宏会先做字符串替换再算表达式。eval 差不多同样的道理,也先把表达式拼出来,再用 eval 计算。
宏替换和 eval 的区别是宏替换只做一次,所以一般不能用于循环中。
D7=D3.group@1 (xxx) // 先去重,如果xxx已经唯一可以不做这一步
A3.join@d(xxx, D7:xxx) // 这样就是 join on not in,比 contain 那种写法快得多。
类似 inner join 只是为了过滤,也可以用
A3.join@i(xx, D7:xxx) // 原来的 join(…) 返回的是两列表,还要再取一下第一字段
2018 版应该也支持这种写法。
用 join(…) 函数也可以写出类似 left join on A is null 这种逻辑。
join@1(A3…; D3…).select(#2==null) // 左连接用 @1,但还是返回两列表,要再取第一字段才行。
学到了,老师,很干