如何在Oracle Data Integrator 12c中为分组依据字段创建字符串 查询结果

问题描述

我是ODI 12c的新手。我最近安装了它,并对其进行了一些测试。我有一张这样的桌子:

enter image description here

我的目标是我要对 customer_id 进行分组,并为每个 customer_id 创建 JSON 格式的字符串。在Oracle数据库中,可以使用以下查询来做到这一点:

  select customer_id,'[' || listagg('{"TRX_ID":' 
    || '"' || trx_id || '"' || ',"count_rules":' 
    || '"' || count_rules || '"'  
    || '}',',') within group(order by count_rules) || ']' as JSON_RULES
  from (select customer_id,trx_id,count(rules) as count_rules from test_rules group by 
  customer_id,trx_id) group by customer_id

结果是这样的:

enter image description here

但是,我想在ODI 12c中做同样的工作,请您指导我如何做?

我们非常感谢您的帮助。

解决方法

ODI版本12c(12.1.3)具有JSON支持。即使您安装的ODI的子版本不支持JSON格式,您仍然可以在数据库中创建视图

$ docker run --rm -it --name spinner -v data:/data -v /var/run/docker.sock:/var/run/docker.sock alpine /bin/sh
/ # apk update -qq && apk add docker-cli -qq
/ # echo "It works!" >> /data/test.txt
/ # docker run --rm --name spinnee --volumes-from "$(hostname)" alpine /bin/sh -c "cat /data/test.txt"
It works!

然后从ODI进行呼叫,就像

CREATE OR REPLACE VIEW v_test_rules AS
WITH t AS
(
SELECT JSON_OBJECT(KEY 'trx_id' IS TO_CHAR(trx_id) FORMAT JSON,KEY 'count_rules' IS TO_CHAR(COUNT(rules)) FORMAT JSON) AS jo,customer_id                          
  FROM test_rules 
 GROUP BY customer_id,trx_id
)
SELECT customer_id,JSON_ARRAYAGG( jo ) AS json_rules
  FROM t
 GROUP BY customer_id

Demo

,

可以根据需要对映射中的聚合组件进行参数化以使用自定义的GROUP BY子句。

以下是使用此组件的方法:

  1. 将聚合组件从组件窗格拖放到映射画布
  2. 将CUSTOMER_ID列从源数据存储区拖动到聚合组件
  3. 单击聚合组件,转到“属性”选项卡并添加新列JSON_RULES enter image description here
  4. 在映射画布中单击该新属性,然后设置表达式Enable
  5. 默认情况下,聚合组件会将所有属性的'[' || listagg('{"TRX_ID":' || '"' || trx_id || '"' || ',"count_rules":' || '"' || count_rules || '"' || '}',',') within group(order by count_rules) || ']'属性设置为Is Group By。 Auto表示在表达式中没有聚合功能的所有属性将成为GROUP BY子句的一部分。因此,在您的情况下,只有CUSTOMER_ID应该在GROUP BY子句中,并且应该可以。如果在GROUP BY子句中错误地添加了JSON_RULES属性,您仍然可以将Auto属性设置为No。
  6. 如果需要更高级的GROUP BY子句,仍然可以在聚合组件的“常规”选项卡中手动设置一个。如果需要,我们也可以在这里设置HAVING子句 enter image description here

[编辑]我没有看到您那里有一个子查询。您只需要在我通过CUSTOMER_ID和TRX_ID显示要聚合的组件之前放置第一个聚合组件即可。

,

我在ODI方面经验不足,但是它支持Oracle的JSON SQL函数吗?

查询

WITH
    test_rules (trx_id,customer_id,rules)
    AS
        (SELECT 1,'a',3 FROM DUAL
         UNION ALL
         SELECT 1,1 FROM DUAL
         UNION ALL
         SELECT 2,5 FROM DUAL
         UNION ALL
         SELECT 2,1 FROM DUAL
         UNION ALL
         SELECT 3,'b',2 FROM DUAL
         UNION ALL
         SELECT 3,3 FROM DUAL
         UNION ALL
         SELECT 4,'c',2 FROM DUAL
         UNION ALL
         SELECT 4,3 FROM DUAL
         UNION ALL
         SELECT 5,'d',1 FROM DUAL
         UNION ALL
         SELECT 5,4 FROM DUAL)
  SELECT customer_id,json_arrayagg (json_object (KEY 'TRX_ID' VALUE trx_id,KEY 'count_rules' VALUE count_rules))    AS json_rules
    FROM (  SELECT customer_id,trx_id,COUNT (*) AS count_rules
              FROM test_rules
          GROUP BY customer_id,trx_id)
GROUP BY customer_id;

结果

   CUSTOMER_ID                                                     JSON_RULES
______________ ______________________________________________________________
a              [{"TRX_ID":2,"count_rules":2},{"TRX_ID":1,"count_rules":2}]
b              [{"TRX_ID":3,"count_rules":3}]
c              [{"TRX_ID":4,"count_rules":2}]
d              [{"TRX_ID":5,"count_rules":2}]