我想知道是否有一种更快的方法来完成我下面要做的事情——基本上,取消数组的测试并创建一个具有不同列的grouparray。
-- create table
CREATE TABLE default.t15 ( product String, indx Array(UInt8), col1 String, col2 Array(UInt8)) ENGINE = Memory ;
--insert values
INSERT into t15 values ('p',[1,2,3],'a',[10,20,30]),('p',[1,2,3],'b',[40,50,60]),('p',[1,2,3],'c',[70,80,90]);
-- select values
SELECT * from t15;
┌─product─┬─indx────┬─col1─┬─col2───────┐
│ p │ [1,2,3] │ a │ [10,20,30] │
│ p │ [1,2,3] │ b │ [40,50,60] │
│ p │ [1,2,3] │ c │ [70,80,90] │
└─────────┴─────────┴──────┴────────────┘
期望输出
┌─product─┬─indx_list─┬─col1_arr──────┬─col2_arr───┐
│ p │ 1 │ ['a','b','c'] │ [10,40,70] │
│ p │ 2 │ ['a','b','c'] │ [20,50,80] │
│ p │ 3 │ ['a','b','c'] │ [30,60,90] │
└─────────┴───────────┴───────────────┴────────────┘
我是怎么做的->[有点慢我需要这个]
SELECT product,
indx_list,
groupArray(col1) col1_arr,
groupArray(col2_list) col2_arr
FROM (
SELECT product,
indx_list,
col1,
col2_list
FROM t15
ARRAY JOIN
indx AS indx_list,
col2 AS col2_list
ORDER BY indx_list,
col1
)x
GROUP BY product,
indx_list;
基本上,我正在取消数组的测试,然后将它们分组回来。有没有更好更快的方法来做到这一点。
谢谢!
2条答案
按热度按时间rggaifut1#
如果你想让它更快,它看起来像你可以避免subselect和全局顺序。比如:
如果需要对数组进行排序,通常最好在每个组中分别使用arraysort对其进行排序。
kr98yfug2#
我将使查询变得简单一些,以将数组联接的计数减少到1,这可能会提高性能:
也许改变表结构以去掉任何数组是有意义的。我建议采用平面模式: