用 SQL 连接第一个和以前的记录

Concate first and previous records with SQL

我有一个文件,我需要从中将数据插入 table,如下所示:

我需要将每条以 DTL 开头的记录与其后面以 DT2 开头的记录连接起来。

在 Informatica 中,灵魂看起来像这样:

文件只加载了一列。

试试这样的东西:

with 
t_rownum as 
(SELECT data_string,
 ROW_NUMBER() OVER(ORDER BY (SELECT NULL)) AS rownum
FROM TEMP_TABLE),
t_dtl as (select * from t_rownum where SUBSTRING(DATA_STRING,1,3)='DTL'),
t_dt2 as (select * from t_rownum where SUBSTRING(DATA_STRING,1,3)='DT2'),
t_dtl_2 as (select 
t_dtl.data_string || t_dt2.data_string as data_string
from t_dtl inner join t_dt2 on t_dtl.rownum=t_dt2.rownum-1)
SELECT
DATA_STRING
FROM t_dtl_2 WHERE SUBSTRING(DATA_STRING,1,3)='DTL'
and SUBSTRING(DATA_STRING,255,3)='DT2'
;

对于上一行结果,也可以使用LAG -

with data_cte as 
(SELECT column1 from values
 ('ABCfs'),
 ('DT2ad'),
 ('DTLskf'),
 ('DT2etv'),
 ('DTLbrf'),
 ('DT2tf'),
 ('ABCbr'),
 ('DT2g6'),
 ('DTLdh'),
 ('DT2jw')
 ), c_p_cte as
 (
 select substr(column1,1,3) column1,lag(substr(column1,1,3)) 
over (order by null) column2 from data_cte 
 )
 select case 
 when column1='DTL' and column2='DT2' then column1||column2
 else column1
 end col_val
 from c_p_cte;

通过上述查询,结果为 -

COL_VAL
-------
ABC
DT2
DTLDT2
DT2
DTLDT2
DT2
ABC
DT2
DTLDT2
DT2

整行数据似乎被读入一个 RECORD_DETAIL 端口(将其视为一列)。因此,这个单个端口被加载到目标数据库中的单个列中。

为了加载单独的列,您需要将文件作为分隔文件来读取。在这种情况下,使用竖线 (|) 作为分隔符。

现在,您提到您需要“连接每条记录”——据我了解,这意味着连接所有行的所有列。而这正是那里发生的事情。