SQL合并最小时差

时间:2018-07-31 12:41:22

标签: sql join db2

我在处理SQL语句时遇到了麻烦,这有点超出了我的技能水平。在DB2数据仓库中运行它。

我需要根据一些ID以及TABLE1中的日期(STARTDATE)和TABLE2中的日期(TIME_SENT)之间的最小时间差,将TABLE2中的两列(CODE1和CODE2)连接到TABLE1中。下面的语句显示了我正在尝试执行的操作,但是group byhaving子句的排序存在问题。

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) |
---------------------------------------------------------------------------------------------

因此,TABLE2每个唯一ID (CODE1,CODE2)可以有几个不同的代码对(ID1,ID2),但是我只想保留TABLE2.TIME_SENT最接近{{1 }}。

1 个答案:

答案 0 :(得分:0)

我认为您不能在内部查询中选择CODE1和CODE2,因为它们不在“分组依据”或“聚合函数”中。我认为您需要一个内部查询,该查询只查找给定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中没有匹配项,但是您仍然希望返回。