簡體   English   中英

具有右表條件的 LEFT JOIN

[英]LEFT JOIN with right table criteria

我想使用以下標准連接表 A 和 B 以獲得結果表。

表 A 是開始時間表 B 包括 TIME IN 和 TIME OUT 用戶需要打卡(TIME IN),啟動機器(TIME START),打卡(TIME OUT)

  1. 時間 >= 時間開始
  2. 時間開始 >= 超時
  3. 最長進出時間
  4. 基於 ID 的 DISTINCT 結果

我嘗試了左加入,但無法得到我想要的結果。 我嘗試使用 CASE 但有很多多余的結果。 請指教。

在此處輸入圖像描述

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' 您需要拆分此顯式

您可以使用幾個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的描述和您提供的所需結果似乎並不同步。 上面的示例假設IN/OUT既是IN又是OUT 如果有重復條目,這還將為您提供最大TimeIn/TimeOut值。

DB Fiddle (Postgres)

嘗試在連接之前聚合表 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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM