Почему бы не упростить запрос и просто сделать один проход?
select
Tag as 'Tag ID'
, UID_KEG
, max(iif(UID_STATION=4,CONVERT(VARCHAR(10), MOVEMENT_DATE, 105),null)) as [DATE]
, max(iif(UID_STATION=4,CONVERT(VARCHAR(10), MOVEMENT_DATE, 108),null)) as [Time Out]
, max(iif(UID_STATION=5,CONVERT(VARCHAR(10), MOVEMENT_DATE, 108),null)) as [Time IN]
from MOVEMENT M
Inner join KEG K on
K.UNIQUE_ID = M.UID_KEG
AND Convert(varchar(10),MOVEMENT_DATE,120) = '2019-06-13'
and UID_STATION in (4,5)
and TAG <> 'NO TAG'
group by
Tag
, UID_KEG
Если вы хотите сохранить cte, то, во-первых, поскольку вы делаете внутреннее соединение, вы можете потерять это:
where Exists (Select CTE2.[Tag ID]
from CTE2
where CTE2.[Tag ID] = CTE.[Tag ID] )
Если вы выполняете внутреннее соединение с [Tag ID], вы получаете значения только в обеих таблицах
Я бы потерял предложение where и изменил бы его на внешнее соединение, в этом случае вы получите все идентификаторы тегов, независимо от того, находятся они внутри или снаружи, или, возможно, левое внешнее соединение, если вы хотите, чтобы все теги были с входом дата, как это:
With CTE AS
(
select Tag as 'Tag ID', UID_KEG, CONVERT(VARCHAR(10), MOVEMENT_DATE, 105)
as [DATE],CONVERT(VARCHAR(10), MOVEMENT_DATE, 108) as [Time Out]
from MOVEMENT M
Inner join KEG K on K.UNIQUE_ID = M.UID_KEG
where Convert(varchar(10),MOVEMENT_DATE,120) = '2019-06-13'
and UID_STATION = 4
and TAG <> 'NO TAG'
) ,
CTE2 AS
(select Tag as 'Tag ID', UID_KEG, CONVERT(VARCHAR(10), MOVEMENT_DATE, 105)
as [DATE],CONVERT(VARCHAR(10), MOVEMENT_DATE, 108) as [Time IN]
from MOVEMENT M
Inner join KEG K on K.UNIQUE_ID = M.UID_KEG
where Convert(varchar(10),MOVEMENT_DATE,120) = '2019-06-13'
and UID_STATION = 5
and TAG <> 'NO TAG'
)
Select CTE.[Tag ID], CTE.[DATE], [Time IN], [Time Out],DATEDIFF(MINUTE,
[Time IN], [Time Out]) as [Time in Process]
from CTE
LEFT Join CTE2 on CTE2.[Tag ID] = CTE.[Tag ID]
--- добавлено в редактирование
Если вы хотите указать время входа и выхода, как насчет:
SELECT
Tag AS 'Tag ID',
UID_KEG,
MAX(iif(UID_STATION = 4, CONVERT(varchar(10), MOVEMENT_DATE, 105), NULL)) AS [DATE],
MAX(iif(UID_STATION = 4, CONVERT(varchar(10), MOVEMENT_DATE, 108), NULL)) AS [Time Out],
MAX(iif(UID_STATION = 5, CONVERT(varchar(10), MOVEMENT_DATE, 108), NULL)) AS [Time IN],
DATEDIFF(MINUTE,
MAX(iif(UID_STATION = 4, MOVEMENT_DATE, NULL)),
MAX(iif(UID_STATION = 5, MOVEMENT_DATE, NULL))) AS [Time Elapsed]
FROM MOVEMENT M
INNER JOIN KEG K
ON K.UNIQUE_ID = M.UID_KEG
AND CONVERT(varchar(10), MOVEMENT_DATE, 120) = '2019-06-13'
AND UID_STATION IN (4, 5)
AND TAG <> 'NO TAG'
GROUP BY Tag,
UID_KEG