如何求一个INT向量中的值落在另一个INT向量中哪个区间范围?

比如:

v1 = [-5, 5, 10, 15, 20, 25, 100]
v2 = [-9999999, 0, 10, 30, 9999999]

向量v2 中,-9999999表示负无穷,9999999表示正无穷,向量v2 表示的区间范围为4个:C9999999_0,0_10,C10_30,C30_9999999。求向量v1 每个元素分别落在向量v2表示的哪个区间范围?

要求:左开右闭。

请先 登录 后评论

3 个回答

Juntao Wang
v1 = [-5, 5, 10, 15, 20, 25, 100]
v2 = [-9999999, 0, 10, 30, 9999999]

res = array(ANY, v2.size()-1)
for(i in 0 : (v2.size()-1)) {
	if (v2[i] == -9999999 && v2[i+1] != 9999999) cond = v1 <= v2[i+1]
	else if (v2[i+1] == 9999999) cond = v1 > v2[i]
	else cond = v1 > v2[i] && v1 <= v2[i+1]
	res[i] = iif(cond, strReplace("C" + v2[i] + "_" + v2[i+1], "-", ""), string(NULL))
}
reduce(add, res)

结果:

attachments-2021-08-H94LFCL6612b7c4fa7f4b.png

请先 登录 后评论
blliu

假设有如下两个向量

v1 = [-5, 5, 10, 15, 20, 25, 100]
v2 = [-9999999, 0, 10, 30, 9999999]

可以按照如下方案实现

select id, section from aj(table(v1 as id), table(v2 as id, ["C9999999_0", "C0_10", "C10_30", "C30_9999999", NULL] as `section), `id);

测试数据数据量:v1有100万,v2有102条

attachments-2024-02-P6Za2ilu65bb2e23177df.png

请先 登录 后评论
Polly

可以用 asof 实现,并利用一个字典维护数据范围:

v1 = [-5, 5, 10, 15, 20, 25, 100]
v2 = [-9999999, 0, 10, 30, 9999999]
d = dict(INT, STRING)
d[-9999999]="C9999999_0"
d[0]="C0_10"
d[10]="C10_30"
d[30]="C30_9999999"

d[v2.at(asof(v2, v1))]
请先 登录 后评论