我有一列是每行有键值对的映射,我想过滤掉一些我不关心的键,这样生成的映射是每行的过滤版本。
我关心的键将在一个数组中,但应该对其进行排序。我如何将键数组与 IN 运算符一起使用,以便我可以使用 map_filter 函数,或者是否有任何其他方法可以使用 element_at 函数来获取每行的映射。我没有在文档中找到任何内容。
更新: 我在这里发布源表和结果表,因为我采用的方法可能不是最好的,所以感谢任何将下表转换为结果表的帮助。
我的过滤器 | 地图专栏 |
---|---|
A | {x=1, z=2, y=3, p=4, q=5} |
A | {z=1, y=2, x=1, p=4, q=5} |
A | {y=2, x=2, z=3, p=4, q=5} |
现在我想要一个结果映射,它只包含不是 p 和 q 但按 mapKey 排序的键,结果如下:
我的过滤器 | 地图专栏 |
---|---|
A | {x=1, y=3, z=2} |
A | {x=1, y=2, z=1} |
A | {x=2, y=2, z=3} |
最终我想接受它并应用 approx_distinct 我得到所有唯一的值组合,我的地图键被排序所以我得到 {1,3,2},{3,2,1},{2,2,3}
到目前为止,我有这个 SQL 查询:
WITH temp AS (
SELECT array_sort(filter(map_keys(mapColumn), x -> x not in ('id', 'image')))) as myFiltered
FROM myTable WHERE myFilter = 'a'
)
SELECT map_filter(mapColumn,(k, v) -> k in temp.myFiltered))) from myTable WHERE myFilter = 'a'
contains
数组函数:
select map_filter(m, (k, v) -> contains(array[1], k)) filtered
from (values (map(array[2,1], array['b', 'a']))) as t(m);
输出:
filtered
----------
{1=a}