Sql AWS红移数据库中字符串列的筛选和分组策略

Sql AWS红移数据库中字符串列的筛选和分组策略,sql,amazon-redshift,Sql,Amazon Redshift,如何为AWS红移数据库中的字符串列制定筛选和分组策略 Table_Id | Categories | Value <ID> | AAA1; AAA1-1; AAA2 | 10 <ID> | AAA1; AAA1-2; AAA2 | 15 <ID> | AAA2 | 5 ..... Table|Id | Categories | Value |AAA1;AAA1-1;AAA2 | 10

如何为AWS红移数据库中的字符串列制定筛选和分组策略

Table_Id | Categories          | Value
<ID>     | AAA1; AAA1-1; AAA2  | 10
<ID>     | AAA1; AAA1-2; AAA2  | 15
<ID>     | AAA2                | 5
.....
Table|Id | Categories | Value
|AAA1;AAA1-1;AAA2 | 10
|AAA1;AAA1-2;AAA2 | 15
|AAA2 | 5
.....
现在,我想根据单个类别筛选记录,如“AAA1”或“AAA1和AAA2” 查询的预期输出如下所示:

Table_Id | Categories         | Value
<ID>     | AAA1               | 25
<ID>     | AAA1-1             | 10
<ID>     | AAA1-2             | 15
<ID>     | AAA2               | 30
.....
Table|Id | Categories | Value
|AAA1 | 25
|AAA1-1 | 10
|AAA1-2 | 15
|AAA2 | 30
.....
因此,需要根据单个类别对结果进行分组。 请注意,这并不满足我的用例,因为不可能在大量记录上运行regex或split_部分。运行该解决方案需要4个多小时才能获取数据

我们尝试过的其他替代方法:

  • 为每个可能的组合生成哈希值,然后使用此哈希进行查找。但是,这会导致大量散列值
  • 为每个类别分配一个不同的素数,然后根据该值存储素数的乘积。但是,这会导致大量数据无法存储在数据库中

  • 是否有其他数学或其他策略可用于解决此问题?

    您需要更好格式的数据进行查询。有两种可能的设计:

    每个属性都有一列的单个表

    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 <table> SET CAT-AAA1 = TRUE WHERE Categories CONTAINS '%AAA1;%'
    
    SELECT SUM(Value)
    FROM <table>
    JOIN <lookup-table> USING Table_Id
    WHERE Category = 'AAA1';
    
    选择总和(值)
    从…起
    使用表\u Id进行连接
    其中类别='AAA1';
    
    您需要更好的数据格式进行查询。有两种可能的设计:

    每个属性都有一列的单个表

    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 <table> SET CAT-AAA1 = TRUE WHERE Categories CONTAINS '%AAA1;%'
    
    SELECT SUM(Value)
    FROM <table>
    JOIN <lookup-table> USING Table_Id
    WHERE Category = 'AAA1';
    
    选择总和(值)
    从…起
    使用表\u Id进行连接
    其中类别='AAA1';
    
    每行总共有多少个类别?@JohnRotenstein-总共有约400个类别。在一个特定的行中,这些类别可以是任意数量的组合。每行总共有多少个类别?@JohnRotenstein-总共有大约400个类别。在特定行中,可以有任意数量的这些类别的组合。