LEFT JOIN с критериями правой таблицы - PullRequest
1 голос
/ 09 мая 2020

Я хотел бы объединить таблицы A и B со следующими критериями, чтобы получить таблицу результатов.

ТАБЛИЦА A - это начальное ВРЕМЯ ТАБЛИЦА B, состоящая из TIME IN и TIME OUT, которые ПОЛЬЗОВАТЕЛЬ должен отсчитывать в ( TIME IN), запуск машины (TIME START), истечение времени (TIME OUT)

  1. TIME IN> = TIME START
  2. TIME START> = TIME OUT
  3. МАКСИМАЛЬНОЕ ВРЕМЯ ВХОДА / ВЫХОДА
  4. РАЗЛИЧНЫЕ результаты на основе идентификатора

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

enter image description here

Ответы [ 3 ]

0 голосов
/ 09 мая 2020

Вы можете сделать это с помощью пары LEFT JOINs:

SELECT 
  ts.ID, 
  MAX(ti.Time) AS Time, 
  MAX(ts.TimeStart) AS TimeStart, 
  MAX(tto.Time) AS TimeOut
FROM tableA ts
LEFT JOIN tableB ti ON ts.ID = ti.ID AND ti.Code IN ('IN','IN/OUT') -- "Time IN"
LEFT JOIN tableB tto ON ts.ID = tto.ID AND tto.Code IN ('Out','IN/OUT') -- "Time OUT"
GROUP BY ts.ID
ORDER BY ts.ID

Как уже упоминалось, Impaler, ваше описание IN/OUT и желаемый результат, который вы предоставили, не совпадают c. В приведенном выше примере предполагается, что IN/OUT - это одновременно IN и OUT. Это также даст вам максимальное TimeIn/TimeOut значения, если есть повторяющиеся записи.

DB Fiddle (Postgres)

0 голосов
/ 09 мая 2020

Попробуйте агрегировать таблицу B перед объединением:

WITH cte AS 
 ( -- pivot into in/out time
   SELECT
      ID
     ,Max(CASE WHEN Code IN ('IN', 'IN/OUT') THEN Time END) AS TimeIn
     ,Max(CASE WHEN Code IN ('Out','IN/OUT') THEN Time END) AS TimeOut
   FROM tableB
   GROUP BY ID
 ) 
SELECT
   a.ID
  ,CASE WHEN TimeStart >= TimeIn THEN TimeIn END AS TimeIn
  ,TimeStart                                                                                                                          
  ,CASE WHEN TimeStart <= TimeOut THEN TimeIn END AS TimeIn
FROM tableA AS a
LEFT JOIN cte AS b
  ON a.ID = b.ID
0 голосов
/ 09 мая 2020
SELECT a.ID     as id,
       GROUP_CONCAT(CASE
                        WHEN b.Code = 'In'
                            THEN b.Time
           end) as `Time In`,
       `TIME START`,
       GROUP_CONCAT(CASE
                        WHEN b.Code = 'Out'
                            THEN b.Time
           end) as `Time Out`
FROM `Table A` a
JOIN `Table B` b on a.ID = b.ID
WHERE 1
  AND ((b.Code = 'In' && b.`TIME` <= a.`TIME START`) OR
       (b.Code = 'Out' && b.`TIME` >= a.`TIME START`))
GROUP BY a.ID, a.`Time Start`

запрос не обрабатывает Code = 'In / Out', вам нужно разделить этот явный

...