Совместный набор результатов - PullRequest
1 голос
/ 19 июня 2019

У меня есть запрос, который возвращает набор результатов, теперь мне нужно изменить запрос, чтобы он также возвращал другой набор результатов

Я выполнил приведенный ниже код, и он возвращает результаты, где tagID есть в обоих CTE, и дает вам время и время ожидания. Мне нужно изменить запрос сейчас, чтобы он показывал мне все теги, которые также были отсканированы с указанием времени в, а не времени ожидания и наоборот, без дубликатов.

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
Inner Join CTE2 on CTE2.[Tag ID] = CTE.[Tag ID]
where Exists (Select CTE2.[Tag ID] 
       from CTE2
       where CTE2.[Tag ID] = CTE.[Tag ID] )

Запрос в минуту дает мне следующие результаты:

TAG ID                      DATE        Time_In     Time_Out    DIF
33154A36D00F46C000007144    6/13/2019   4:43:05 AM  6:25:27 AM  102
33154A36D00F46C00000464A    6/13/2019   4:43:47 AM  6:06:45 AM  83
33154A36D00F46C000006DFF    6/13/2019   4:46:22 AM  6:25:27 AM  99
33154A36D00F46C0000040A8    6/13/2019   4:54:23 AM  6:10:55 AM  76
33154A36D00F46C000002ECB    6/13/2019   4:55:59 AM  6:10:55 AM  75
33154A36D00F46C000002A2F    6/13/2019   5:03:18 AM  6:20:40 AM  77
33154A36D00F46C000000499    6/13/2019   5:34:35 AM  6:25:27 AM  51
33154A36D00F46C00000627C    6/13/2019   5:38:04 AM  6:25:27 AM  47
33154A36D00F46C000006F74    6/13/2019   5:38:06 AM  6:28:42 AM  50

Я сейчас ищу также и нижеследующее:

33154A36D00F46C000006F38    6/13/2019              6:28:42 AM   
33154A36D00F46C000006F62    6/13/2019              6:47:42 AM   
33154A36D00F46C000006F90    6/13/2019              7:47:12 AM

Ответы [ 2 ]

0 голосов
/ 19 июня 2019

Почему бы не упростить запрос и просто сделать один проход?

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
0 голосов
/ 19 июня 2019

Что вы можете сделать, это создать второе предложение CTE, которое выбирает то, что вы описываете, с тем же макетом поля и пустыми значениями в полях, которые не имеют отношения к делу.

Затем, чтобы выбрать из обоих, вы делаете

 SELECT * FROM CTE_A 
 UNION ALL 
 SELECT * FROM CTE_B 
          WHERE CTE_B.tag NOT IN (SELECT CTE_A.tag FROM CTE_A)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...