如何为AWS Redshift数据库中的String列过滤和分组?
Table_Id | Categories | Value
<ID> | AAA1; AAA1-1; AAA2 | 10
<ID> | AAA1; AAA1-2; AAA2 | 15
<ID> | AAA2 | 5
.....
现在我想基于个别类别过滤记录,例如AAA&#39;或者&#39; AAA1和AAA2&#39; 查询的预期输出将是:
Table_Id | Categories | Value
<ID> | AAA1 | 25
<ID> | AAA1-1 | 10
<ID> | AAA1-2 | 15
<ID> | AAA2 | 30
.....
因此需要根据个别类别对结果进行分组。 请注意,此question不满足我的用例,因为不可能在大量记录上运行正则表达式或split_part。运行该解决方案会导致4个多小时的时间来获取数据。
我们尝试过的其他替代方法:
是否有其他可用于解决此问题的数学或其他策略?
答案 0 :(得分:2)
您需要更好的格式数据才能进行查询。有两种潜在的设计:
包含每个属性列的单个表
Table_Id | Categories | Value | CAT-AAA1 | CAT-AAA1-1 | CAT-AAA2
<ID> | AAA1; AAA1-1; AAA2 | 10 | TRUE | TRUE | TRUE
<ID> | AAA1; AAA1-2; AAA2 | 15 | TRUE | FALSE | TRUE
<ID> | AAA2 | 5 | FALSE | FALSE | TRUE
.....
这将涉及为每个属性添加一列,然后运行一些UPDATE命令来填充列,例如:
UPDATE <table> SET CAT-AAA1 = TRUE WHERE Categories CONTAINS '%AAA1;%'
然后,查询表格会很容易:
SELECT SUM(Value) FROM <table> WHERE CAT-AAA1 AND CAT-AAA1-2;
Redshift每张表最多可处理1600列。在数据仓库中拥有宽表是很正常的。
一对多表格
此选项涉及创建一个将每行链接到多个类别的新表:
Table_Id | Category
1 | AAA1
1 | AAA1-1
1 | AAA1-2
2 | AAA1
然后,您可以通过加入此查找表进行查询,以查找正确的行,例如:
SELECT SUM(Value)
FROM <table>
JOIN <lookup-table> USING Table_Id
WHERE Category = 'AAA1';