【问题标题】:LEFT JOIN with right table criteria具有右表条件的 LEFT JOIN
【发布时间】:2020-08-24 16:50:30
【问题描述】:

我想用以下条件连接表 A 和 B 以获得结果表。

TABLE A 是开始时间 表 B 包含 TIME IN 和 TIME OUT USER需要打卡(TIME IN),开机(TIME START),打卡(TIME OUT)

  1. 时间 >= 时间开始
  2. 开始时间 >= 超时
  3. 输入/输出最大时间
  4. 基于 ID 的不同结果

我尝试了左连接,但无法获得我想要的结果。我尝试使用 CASE 但有很多多余的结果。请指教。

【问题讨论】:

  • 请将图片中的信息翻译成问题。您能否还包括一些您尝试过的示例查询、示例数据和所需的结果。
  • “IN/OUT 可以是 IN 或 OUT,而不是 IN”——不是根据问题:IN/OUT 被视为 IN。请详细说明,以提供答案。
  • IN/OUT 被视为 IN,因为它小于开始时间。如果它更多,它应该出来

标签: sql join teradata


【解决方案1】:
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' 你需要拆分这个显式

【讨论】:

    【解决方案2】:

    您可以使用几个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)

    【讨论】:

      【解决方案3】:

      在加入前尝试聚合表 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
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-03-13
        • 1970-01-01
        • 2013-01-31
        • 1970-01-01
        • 2017-04-07
        • 1970-01-01
        • 2012-08-22
        相关资源
        最近更新 更多