首页 > 解决方案 > SQL合并最小时间差

问题描述

我的 SQL 语句有点超出我的技能水平。在 DB2 数据仓库中运行它。

我需要根据一些 ID 以及 TABLE1 中的日期 (STARTDATE) 和 TABLE2 中的日期 (TIME_SENT) 之间的最小时间差将 TABLE2 中的两列(CODE1 和 CODE2)加入到 TABLE1 中。下面的语句显示了我正在尝试做的事情,但是对group byandhaving子句的排序有问题。

SELECT * 
FROM TABLE1
LEFT JOIN (SELECT B.ID1, B.ID2, D.CODE1, D.CODE2
           FROM TABLE1 B, TABLE2 D
           WHERE D.STATUS = '7'
           GROUP BY B.ID1, B.ID2
           HAVING ABS(B.STARTDATE - D.TIME_SENT) = MIN(ABS(B.STARTDATE - D.TIME_SENT)) TABLE2 
ON TABLE1.ID1 = TABLE2.ID1
AND TABLE1.ID2 = TABLE2.ID2;

感谢您对此的任何帮助。

结构表1:

---------------------------------------------------------
| ID1 (VARCHAR) | ID2 (VARCHAR) | STARTDATE (TIMESTAMP) | 
---------------------------------------------------------

结构表2:

----------------------------------------------------------------------------------------------------------------
| ID1 (VARCHAR) | ID2 (VARCHAR) | TIME_SENT (TIMESTAMP) | STATUS (INTEGER) | CODE1 (VARCHAR) | CODE2 (VARCHAR) |
----------------------------------------------------------------------------------------------------------------

结构输出:

---------------------------------------------------------------------------------------------
| ID1 (VARCHAR) | ID2 (VARCHAR) | STARTDATE (TIMESTAMP) | CODE1 (VARCHAR) | CODE2 (VARCHAR) |
---------------------------------------------------------------------------------------------

因此,每个唯一 IDTABLE2可以有几个不同的代码对,但我只想保留最接近的代码对。(CODE1,CODE2)(ID1,ID2)TABLE2.TIME_SENTTABLE1.STARTDATE

标签: sqljoindb2

解决方案


我认为您不能在内部查询中选择 CODE1 和 CODE2,因为它们不在 group by 或聚合函数中。我认为您需要一个内部查询来找到给定 id 配对的最小时间差。像这样的东西:

SELECT *
  FROM TABLE1 B
  LEFT OUTER JOIN TABLE2 D
    ON B.ID1    = D.ID1
   AND B.ID2    = D.ID2
   AND D.STATUS = '7'
 WHERE D.ID1 IS NULL
    OR ABS(B.STARTDATE - D.TIME_SENT) = (SELECT MIN(ABS(E.STARTDATE - F.TIME_SENT))
                                           FROM TABLE1 E
                                          INNER JOIN TABLE2 F
                                             ON E.ID1    = F.ID1
                                            AND E.ID2    = F.ID2
                                            AND F.STATUS = '7'
                                          WHERE E.ID1 = B.ID1
                                            AND E.ID2 = B.ID2
                                          GROUP BY
                                                E.ID1
                                               ,E.ID2);

我假设您在 TABLE1 中有一些值在 TABLE2 中没有匹配项,但您仍然希望返回。


推荐阅读