在 Talend 中将两个条目行(开始时间和结束时间)连接为一行

Join two entries rows ( Start time and End time) as a single row in Talend

我有来自 MS SQL 数据库的数据,它与员工的工作时间有关。

问题是,开始时间和结束时间存储为 2 个不同的条目,所以当员工来时,他扫描他的徽章,这被认为是到达时间,当他离开时,他扫描他的徽章再次,这被认为是出发时间。 有一列有助于区分开始时间和结束时间(CodeNr 列:B1 = StartTime,B2 = EndTime)

这就是我的 Table 的样子

现在我需要这个数据作为一个条目,在数据库中的 Talend oder 中,

所以应该看起来像

请使用什么来实现这一点(特别是在 Talend 中,什么时候比在 MS 中更复杂 SQL)?

CREATE TABLE EmployeeWorkLoad(
EmployeeNr bigint,
Year int,
Month int,
Day int,
Hour int,
Minute int,
CodeNr char(2)
)


Insert into [EmployeeWorkLoad] ( [EmployeeNr],[Year],[Month] ,[Day],[Hour], [Minute] ,[CodeNr]) Values (1,2020,1,4,8,30,'B1'), 
(1,2020,1,4,16,45,'B2'), 
(1,2020,1,6,8,15,'B1'), 
(1,2020,1,6,16,45,'B2'),
(2,2020,3,2,8,10,'B1'), 
(2,2020,3,2,16,5,'B2')
  
  
GO

6 行受影响

WITH CTE AS (
select EmployeeNr,Year,Month,Day,

MAX(CASE WHEN CodeNr='B1' THEN Hour  END) AS StartHour,
MAX(CASE WHEN CodeNr = 'B1' THEN Minute END) AS StartMinute,
MAX(CASE WHEN CodeNr = 'B2' THEN Hour END) AS EndHour,
MAX(CASE WHEN CodeNr = 'B2' THEN Minute END) AS EndMinute

from EmployeeWorkLoad
group by EmployeeNr,Year,Month,Day )

SELECT * , ABS(EndHour-StartHour) AS DutationHour
,ABS(IIF(EndMinute <StartMinute, EndMinute+60, EndMinute)- StartMinute) AS DurationMinute
FROM
CTE
GO
EmployeeNr | Year | Month | Day | StartHour | StartMinute | EndHour | EndMinute | DutationHour | DurationMinute
---------: | ---: | ----: | --: | --------: | ----------: | ------: | --------: | -----------: | -------------:
         1 | 2020 |     1 |   4 |         8 |          30 |      16 |        45 |            8 |             15
         1 | 2020 |     1 |   6 |         8 |          15 |      16 |        45 |            8 |             30
         2 | 2020 |     3 |   2 |         8 |          10 |      16 |         5 |            8 |             55

db<>fiddle here