如何在AWS Redshift数据库中获取filter和group by子句的子字符串

时间:2018-04-24 06:37:31

标签: sql split amazon-redshift

如何从包含AWS Redshift数据库中的过滤器和group by子句的记录的列中获取子字符串。

我的表格记录如下:

Table_Id | Categories         | Value
<ID>     | ABC1; ABC1-1; XYZ  | 10
<ID>     | ABC1; ABC1-2; XYZ  | 15
<ID>     | XYZ                | 5
.....

现在我想根据个别类别过滤记录,例如ABC1&#39;或&#39; ABC1和XYZ&#39;

查询的预期输出结果如下:

Table_Id | Categories         | Value
<ID>     | ABC1               | 25
<ID>     | ABC1-1             | 10
<ID>     | ABC1-2             | 15
<ID>     | XYZ                | 30
.....

因此需要根据个别类别对结果进行分组。

3 个答案:

答案 0 :(得分:1)

如果在任何“类别”单元格中最多有3个值,则可以取消单元格,获取唯一值列表,并在连接条件中使用该列表,如下所示:

WITH
values as (
    select distinct category
    from (
            select distinct split_part(categories,';',1) as category from your_table
            union select distinct split_part(categories,';',2) from your_table
            union select distinct split_part(categories,';',3) from your_table
     )
     where nullif(category,'') is not null
)
SELECT
 t2.category
,sum(t1.value)
FROM your_table t1
JOIN values t2
ON split_part(categories,';',1)=t2.category
OR split_part(categories,';',2)=t2.category
OR split_part(categories,';',3)=t2.category

如果您有超过3个选项,只需在split_part部分和加入条件中添加另一个WITH级别

答案 1 :(得分:1)

@JonScott,@ AlexYes和其他那些在类似情况下挣扎的好朋友。

我找到了比@AlexYes建议更好的方法。

我做了什么,我奉承了个别记录的类别列。 我可以进一步处理。

<强>查询:

select row_number() over(order by 1) as r1, 
        to_char(timestamptz 'epoch' + date_time * interval '1 second', 'yyyy-mm-dd') AS DAY,
        split_part(categories, ';', numbers.n) as catg,
        value
    from <TABLE>
    join numbers
    on numbers.n <= regexp_count(category_string, ';') + 1 <OTHER_CONDITIONS>

<强>解释

这里有两个函数是有用的:首先,split_part函数,它接受一个字符串,将它拆分为';'分隔符,并返回从分割字符串指定的第一个,第二个,......,第n个值;第二,regexp_count,它告诉我们在字符串中找到特定模式的次数。

答案 2 :(得分:0)

要完全动态地执行此操作,您需要在&#34;类别&#34;中转置或透视值。列成单独的行。 不幸的是,一个充满活力的&#34;使用红移不可能解决方案(事先不知道不同的值)。

您的选择如下:

  1. 在另一个答案中使用AlexYes建议的方法。这是 半动态,可能是你最好的选择。

  2. 在Redshift之外,运行一些ETL代码来执行 专栏 - &gt;多行ETL。

  3. 创建一个硬编码类型的解决方案,并执行如下所示的透视:

    选择table_id,&#39; ABC1&#39;作为类别,concat的情况(类别,&#39 ;;&#39;)ilike&#39;%ABC1;%&#39;然后将值0结束为来自your_table的值 联合所有 选择table_id,&#39; ABC1-1&#39;作为类别,concat的情况(类别,&#39 ;;&#39;)ilike&#39;%ABC1-1;%&#39;然后将值0结束为来自your_table的值 联合所有