如何在 Teradata 14 中对子字符串进行分组?

编程入门 行业动态 更新时间:2024-10-25 16:25:39
本文介绍了如何在 Teradata 14 中对子字符串进行分组?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧! 问题描述

我在Teradata 14中有下表,我不允许自己编写程序和函数,但我可以使用strtok、strtok_split_to_table 等

I have the following table in Teradata 14 , I am not allowed to write procedures and functions myself, but i can use strtok, strtok_split_to_table etc

id property 1 1234X (Yel), 2225Y (Red), 1234X (Gre), 2 3 1222Y (Pin), 4 1134E (Yel), 4565Y (Whi), 1134E (Red), 2222Y (Red),

如何对上表进行分组,以便每个对象的所有属性都列在一个括号中

How can I group the above table so that each object would have all attributes listed in one brackets

id property 1 1234X (Yel Gre), 2225Y (Red), 2 3 1222Y (Pin ), 4 1134E (Yel Red), 4565Y (Whi), 2222Y (Red),

属性代码始终是 5 个字符的字符串,例如1222Y .颜色代码始终为 3 个字符,例如密码

The property code is always a 5 character string, e.g. 1222Y . The color code is always 3 character , e.g. Pin

我尝试使用 这个解决方案 但出现错误 A 列或字符表达式大于最大大小

I tried using this solution but got an error A column or character expression is larger than max size

另外我尝试了 strtok_split_to_table 并且能够创建一个修改过的表,但不知道如何继续

In addition I tried strtok_split_to_table and was able to create a modified table, but do not how to proceed from that

推荐答案

为什么要将非规范化数据存储在 RDBMS 中,然后对其进行处理以创建更糟糕的非规范化输出?

Why do you store denormalized data in a RDBMS and then process it to create even worse denormalized output?

根据您发布的链接修改我的解决方案以使用 STRTOK_SPLIT_TO_TABLE 而不是递归:

Modifying my solution from the link you posted to utilize STRTOK_SPLIT_TO_TABLE instead of recursion:

SELECT id, MAX(CASE WHEN newpos = 1 AND newgrp <> '(),' THEN newgrp ELSE '' END) || MAX(CASE WHEN newpos = 2 THEN newgrp ELSE '' END) || MAX(CASE WHEN newpos = 3 THEN newgrp ELSE '' END) || MAX(CASE WHEN newpos = 4 THEN newgrp ELSE '' END) || MAX(CASE WHEN newpos = 5 THEN newgrp ELSE '' END) || MAX(CASE WHEN newpos = 6 THEN newgrp ELSE '' END) -- add as many CASEs as needed FROM ( SELECT id, ROW_NUMBER() OVER (PARTITION BY id ORDER BY newgrp) AS newpos, TRIM(a || ' (' || MAX(CASE WHEN tokennum = 1 THEN b || ' ' ELSE '' END) || MAX(CASE WHEN tokennum = 2 THEN b || ' ' ELSE '' END) || MAX(CASE WHEN tokennum = 3 THEN b || ' ' ELSE '' END) || MAX(CASE WHEN tokennum = 4 THEN b || ' ' ELSE '' END) || MAX(CASE WHEN tokennum = 5 THEN b || ' ' ELSE '' END) || MAX(CASE WHEN tokennum = 6 THEN b || ' ' ELSE '' END) -- add as many CASEs as needd ) || '), ' AS newgrp FROM ( SELECT id, tokennum, TRIM(SUBSTRING(token FROM 1 FOR POSITION('(' IN TRIM(token)||'(') - 1)) AS a, TRIM(TRAILING ')' FROM SUBSTRING(token FROM POSITION('(' IN token) + 1)) AS b FROM TABLE( STRTOK_SPLIT_TO_TABLE(vt.id, vt.property, ',') RETURNS (id INT, tokennum INT, token VARCHAR(30) CHARACTER SET UNICODE ) ) AS dt ) AS dt GROUP BY id, a ) AS dt GROUP BY id;

如果您可以访问 TDStats.udfconcat 函数,则可以进一步简化(但有一种方法可以控制属性的顺序:

If you got access to the TDStats.udfconcat function it can be further simplified (but there's way to control the order of properties:

SELECT id, CASE WHEN TRIM(TDStats.udfconcat(' ' || a || ' ' || b)) || ',' <> '(),' THEN TRIM(TDStats.udfconcat(' ' || a || ' ' || b)) || ',' ELSE '' END FROM ( SELECT id, TRIM(SUBSTRING(token FROM 1 FOR POSITION('(' IN TRIM(token)||'(') - 1)) AS a, '('|| OTRANSLATE(TDStats.udfconcat(TRIM(TRAILING ')' FROM SUBSTRING(token FROM POSITION('(' IN token) + 1))), ',', ' ') || ')'AS b FROM TABLE( STRTOK_SPLIT_TO_TABLE(vt.id, vt.property, ',') RETURNS (id INT, tokennum INT, token VARCHAR(30) CHARACTER SET UNICODE ) ) AS dt GROUP BY id, a ) AS dt GROUP BY id;

大部分工作都是在正确的位置摆弄空格和逗号以获得​​所需的输出.

Most of the work was fiddling with the spaces and commas in the right place to get the requested output.

我永远不会在 RDBMS 中存储这样的数据.

Still i would never store data as such in a RDBMS.

更多推荐

如何在 Teradata 14 中对子字符串进行分组?

本文发布于:2023-10-25 18:24:21,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1527730.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:对子   字符串   如何在   Teradata

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!