我在处理SQL语句时遇到了麻烦,这有点超出了我的技能水平。在DB2数据仓库中运行它。
我需要根据一些ID以及TABLE1中的日期(STARTDATE)和TABLE2中的日期(TIME_SENT)之间的最小时间差,将TABLE2中的两列(CODE1和CODE2)连接到TABLE1中。下面的语句显示了我正在尝试执行的操作,但是group by
和having
子句的排序存在问题。
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 }}。
答案 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中没有匹配项,但是您仍然希望返回。