微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

多阵列 Clickhouse

如何解决多阵列 Clickhouse

问题: 计算由同一行上的另一个数组过滤的数组中的不同值(和 agg 更高)。

说明: 使用这些数据:

enter image description here

在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 家店):

enter image description here

现在我想要来自 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]           │
└─────────────────────────────────┘

根据此掩码过滤未履行的商店: 请注意,shopsaccumulatedNeed 的大小必须相等。

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 举报,一经查实,本站将立刻删除。