用 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
端口(将其视为一列)。因此,这个单个端口被加载到目标数据库中的单个列中。
为了加载单独的列,您需要将文件作为分隔文件来读取。在这种情况下,使用竖线 (|
) 作为分隔符。
现在,您提到您需要“连接每条记录”——据我了解,这意味着连接所有行的所有列。而这正是那里发生的事情。
我有一个文件,我需要从中将数据插入 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
端口(将其视为一列)。因此,这个单个端口被加载到目标数据库中的单个列中。
为了加载单独的列,您需要将文件作为分隔文件来读取。在这种情况下,使用竖线 (|
) 作为分隔符。
现在,您提到您需要“连接每条记录”——据我了解,这意味着连接所有行的所有列。而这正是那里发生的事情。