etl:我们可以聚合动态行数并使用 talend-open-studio 添加 datedynamic
etl : can we aggregate dynamic number of rows and add datedynamic using-talend-open-studio
我是 Talend Open Studio 的初学者,正在尝试进行以下转换。
来自 SQL 服务器 fact_Table,其中包含:
id_facture produit mouvment quantité_Stock Date
--------------------------------------------------------------
f1 p1 entrée +50 28/04/2018
f2 p1 entrée +10 01/05/2018
f3 p1 sortie -20 02/05/2018
f3 p2 entrée +4 02/05/2018
f4 p2 sortie -1 03/05/2018
f4 p1 entrée +2 03/05/2018
我想制作这个table:
id_facture produit mouvment quantité_Stock Date
-----------------------------------------------------------
f1 p1 entrée 50 28/04/2018
f1 p1 aucune 50 29/04/2018
f1 p1 aucune 50 30/04/2018
f2 p1 entrée 60 01/05/2018
f3 p1 sortie 40 02/05/2018
f3 p2 entrée 4 02/05/2018
f4 p2 sortie 3 03/05/2018
f4 p1 entrée 42 03/05/2018
我想过使用 tAggregateRow,但我发现它不适合我的 issue.how 使用按列分组的滚动总和或累积总和值?
而不是 Talend
这应该在 Sql Server
本身完成,然后您可以检索数据并在 Talend Studio
.
中相应地工作
您的场景是根据某些 ID 和日期范围查找 运行 总数的示例。我已经完成了使用 CROSS APPLY
找到 运行 总数的任务,如果您使用的是 Sql
的 2012+ 版本,那么您会有更多选择。为了找出日期范围,我使用了 LEAD
,它将根据 id 识别紧邻的下一行。
下面的查询将为您完成工作 -
数据设置:
create table #temp(id_facture nvarchar(100), produit nvarchar(100), mouvment nvarchar(100), quantité_Stock int, stockDate date)
insert into #temp
select 'f1', 'p1', 'entrée', 50, '04/28/2018' union all
select 'f2', 'p1', 'entrée', 10, '05/01/2018' union all
select 'f3', 'p1', 'sortie', -20, '05/02/2018' union all
select 'f3', 'p2', 'entrée', 4, '05/02/2018' union all
select 'f4', 'p2', 'sortie', -1, '05/03/2018' union all
select 'f4', 'p1', 'entrée', 2, '05/03/2018'
实际代码:
;WITH CTE1 AS (select
T.id_facture, T.produit,T.mouvment,rt.runningTotal,T.stockDate
from #temp t
cross apply (select sum(quantité_Stock) as runningTotal
from #temp
where produit = t.produit
and stockDate <= t.stockDate
) as rt),
DateList (id_facture,produit,mouvment,runningTotal,stockDate,stockDateEnd)
AS (
SELECT id_facture,produit,mouvment,runningTotal
, stockDate
, LEAD(stockDate, 1) OVER ( PARTITION BY produit ORDER BY stockDate ) AS stockDateEnd
FROM CTE1
UNION ALL
SELECT id_facture,produit,mouvment,runningTotal,DATEADD(DAY,1,stockDate),stockDateEnd FROM DateList
WHERE DATEADD(DAY,1,stockDate) < stockDateEnd
)
SELECT id_facture,produit,mouvment,runningTotal as quantité_Stock,stockDate FROM DateList ORDER BY produit,stockDate
我是 Talend Open Studio 的初学者,正在尝试进行以下转换。
来自 SQL 服务器 fact_Table,其中包含:
id_facture produit mouvment quantité_Stock Date
--------------------------------------------------------------
f1 p1 entrée +50 28/04/2018
f2 p1 entrée +10 01/05/2018
f3 p1 sortie -20 02/05/2018
f3 p2 entrée +4 02/05/2018
f4 p2 sortie -1 03/05/2018
f4 p1 entrée +2 03/05/2018
我想制作这个table:
id_facture produit mouvment quantité_Stock Date
-----------------------------------------------------------
f1 p1 entrée 50 28/04/2018
f1 p1 aucune 50 29/04/2018
f1 p1 aucune 50 30/04/2018
f2 p1 entrée 60 01/05/2018
f3 p1 sortie 40 02/05/2018
f3 p2 entrée 4 02/05/2018
f4 p2 sortie 3 03/05/2018
f4 p1 entrée 42 03/05/2018
我想过使用 tAggregateRow,但我发现它不适合我的 issue.how 使用按列分组的滚动总和或累积总和值?
而不是 Talend
这应该在 Sql Server
本身完成,然后您可以检索数据并在 Talend Studio
.
您的场景是根据某些 ID 和日期范围查找 运行 总数的示例。我已经完成了使用 CROSS APPLY
找到 运行 总数的任务,如果您使用的是 Sql
的 2012+ 版本,那么您会有更多选择。为了找出日期范围,我使用了 LEAD
,它将根据 id 识别紧邻的下一行。
下面的查询将为您完成工作 -
数据设置:
create table #temp(id_facture nvarchar(100), produit nvarchar(100), mouvment nvarchar(100), quantité_Stock int, stockDate date)
insert into #temp
select 'f1', 'p1', 'entrée', 50, '04/28/2018' union all
select 'f2', 'p1', 'entrée', 10, '05/01/2018' union all
select 'f3', 'p1', 'sortie', -20, '05/02/2018' union all
select 'f3', 'p2', 'entrée', 4, '05/02/2018' union all
select 'f4', 'p2', 'sortie', -1, '05/03/2018' union all
select 'f4', 'p1', 'entrée', 2, '05/03/2018'
实际代码:
;WITH CTE1 AS (select
T.id_facture, T.produit,T.mouvment,rt.runningTotal,T.stockDate
from #temp t
cross apply (select sum(quantité_Stock) as runningTotal
from #temp
where produit = t.produit
and stockDate <= t.stockDate
) as rt),
DateList (id_facture,produit,mouvment,runningTotal,stockDate,stockDateEnd)
AS (
SELECT id_facture,produit,mouvment,runningTotal
, stockDate
, LEAD(stockDate, 1) OVER ( PARTITION BY produit ORDER BY stockDate ) AS stockDateEnd
FROM CTE1
UNION ALL
SELECT id_facture,produit,mouvment,runningTotal,DATEADD(DAY,1,stockDate),stockDateEnd FROM DateList
WHERE DATEADD(DAY,1,stockDate) < stockDateEnd
)
SELECT id_facture,produit,mouvment,runningTotal as quantité_Stock,stockDate FROM DateList ORDER BY produit,stockDate