如何从包含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
.....
因此需要根据个别类别对结果进行分组。
答案 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)
我找到了比@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;使用红移不可能解决方案(事先不知道不同的值)。
您的选择如下:
在另一个答案中使用AlexYes建议的方法。这是 半动态,可能是你最好的选择。
在Redshift之外,运行一些ETL代码来执行 专栏 - &gt;多行ETL。
创建一个硬编码类型的解决方案,并执行如下所示的透视:
选择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的值 联合所有
等