如何解决多阵列 Clickhouse
问题: 计算由同一行上的另一个数组过滤的数组中的不同值(和 agg 更高)。
说明: 使用这些数据: 在Size D70中,有5件(hqsize)可用,但商店要求15件。通过使用accumulatedneed,列商店中的前5家商店应该收到物品(因为每个商店要求1件)。即 [4098,4101,4109,4076,4080]。
也可能是accumulateNeed 中的值是[1,4,5,...,15],其中shop 1 请求1 pcs,shop2 3 pcs,等等。那么只有3 个商店会得到。
E75 尺码库存充足,所以每家店都会收到(10 家店):
现在我想要来自 D70 和 E75 的不同商店列表,这将是最终结果: [4098,4080,4062,4063,4067,4072,4075,4056,4058,4059,4061](14家独立店铺)(4109只计算一次)>
想要的结果: [4098,4061]。 (14 家独特的商店) 如果更好的话,我完全可以对数据进行结构化。 之所以不能预先计算,是因为结果取决于过滤了哪些商店。
解决方法
我使用此查询创建包含与您的屏幕截图类似的数据的表:
CREATE TABLE t
(
Size String,hqsize Int,accumulatedNeed Array(Int),shops Array(Int)
) engine = Memory;
INSERT INTO t VALUES ('D70',5,[1,2,3,4,6,7,8,9,10,11,12,13,14,15],[4098,4101,4109,4076,4080,4083,4062,4063,4067,4072,4075,4056,4057,4058,4059]),('E75',43,10],[4109,4059,4061]);
找出哪些商店可以收到足够多的商品:
SELECT arrayMap(x -> (x <= hqsize),accumulatedNeed) as mask FROM t;
┌─mask────────────────────────────┐
│ [1,1,0] │
│ [1,1] │
└─────────────────────────────────┘
根据此掩码过滤未履行的商店:
请注意,shops
和 accumulatedNeed
的大小必须相等。
SELECT arrayFilter((x,y) -> y,shops,mask) as fulfilled_shops,arrayMap(x -> (x <= hqsize),accumulatedNeed) as mask FROM t;
┌─fulfilled_shops─────────────────────────────────────┬─mask────────────────────────────┐
│ [4098,4080] │ [1,0] │
│ [4109,4061] │ [1,1] │
└─────────────────────────────────────────────────────┴─────────────────────────────────┘
然后您可以创建包含所有不同商店的表格:
SELECT DISTINCT arrayJoin(fulfilled_shops) as shops FROM (
SELECT arrayMap(x -> (x <= hqsize),accumulatedNeed) as mask,arrayFilter((x,mask) as fulfilled_shops FROM t
);
┌─shops─┐
│ 4098 │
│ 4101 │
│ 4109 │
│ 4076 │
│ 4080 │
│ 4062 │
│ 4063 │
│ 4067 │
│ 4072 │
│ 4075 │
│ 4056 │
│ 4058 │
│ 4059 │
│ 4061 │
└───────┘
14 rows in set. Elapsed: 0.049 sec.
或者如果您需要单个数组将其分组:
SELECT groupArrayDistinct(arrayJoin(fulfilled_shops)) as shops FROM (
SELECT arrayMap(x -> (x <= hqsize),mask) as fulfilled_shops FROM t
);
┌─shops───────────────────────────────────────────────────────────────────┐
│ [4080,4061,4098] │
└─────────────────────────────────────────────────────────────────────────┘
如果您只需要来自 D70 和 E75 的数据,您可以使用 WHERE
从表中过滤额外的行。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。