SQL,从每组中的 json 字段中提取唯一值
postgreySQL 库表的第 1 列是 ID,用于排序;第 2 列是分类;第 3 列类似 json(非标准 json), 并存在重复项。
id |
component_type |
component_names |
1 |
INGESTION |
{ingestiona,atul, ingestiona, ingestionb} |
2 |
INGESTION |
{test_s3_prerit, atul} |
3 |
DQM |
{testmigration} |
4 |
SCRIPT |
{scripta,scripta,scripta,testimportscript,testimportscript,b,c,c,x} |
5 |
SCRIPT |
{testimportscript, scripta,scripta,a,a,b,b,c} |
6 |
SCRIPT |
{Script_Python,scripta,x} |
7 |
BUSINESS_RULES |
{s3_testH_Graph} |
8 |
EXPORT |
{Export2} |
要求:用 Java 提取每组的唯一值,并使其位于原记录的原位置;或者说,按照原分组每条记录的顺序,自上而下依次删掉重复的项,唯一值保持原位。
component_type |
component_names |
INGESTION |
{ingestiona,atul,ingestionb} |
INGESTION |
{test_s3_prerit} |
DQM |
{testmigration} |
SCRIPT |
{scripta,testimportscript,b,c,x} |
SCRIPT |
{a} |
SCRIPT |
{Script_Python} |
BUSINESS_RULES |
{s3_testH_Graph} |
EXPORT |
{Export2} |
编写SPL代码
A |
|
1 |
=post1.query("select component_type,component_names from tb order by id") |
2 |
=A1.run(#2=mid(#2,2,len(#2)-2).split@tc() ) |
3 |
=A2.group@u(#1).(~.run( #2=(#2[-1]|#2).id@u() ).rvs().run(#2=#2\#2[1])) |
4 |
return A1.run(#2="{"+#2.concat@c()+"}") |
A1:通过JDBC查询数据库。
A2:将每条记录的第 2 个字段拆分为多项。
A3:按第 1 列分组并保持原序,然后处理每组数据:按记录顺序累积各项,并去除重复;颠倒记录顺序;用本记录的累积结果和下条记录的累积结果求差集。
A4:恢复原字符串格式,并返回结果。
Java 集成 SPL 可参考 Java 如何调用 SPL 脚本
问题来源:https://stackoverflow.com/questions/78414871/appying-unique-constraint-on-text-and-text-column-in-pgsql
英文版 https://c.scudata.com/article/1725435833217