对不起,标题很难用几句话来解释(这表明我并不完全理解问题)。
Service Table: (there are other field but not relevant here)
-------------------------------
| PK1 | REF | Ops_Date |
-------------------------------
| 1 | ABCD | 20180211 |
| 2 | EFGH | 20180315 |
| 3 | ABCD | 20180412 |
-------------------------------
Dim Table:
-------------------------------
| PK2 | REF | Arrival |
-------------------------------
| 57 | ABCD | 20180108 |
| 58 | ABCD | 20180201 |
| 59 | EFGH | 20180309 |
| 60 | EFGH | 20180311 |
| 61 | ABCD | 20180409 |
| 62 | ABCD | 20180411 |
-------------------------------
Result:
--------------------------------------------------------
| PK1 | REF | Ops_Date | PK2 | Arrival |
--------------------------------------------------------
| 1 | ABCD | 20180211 | 58 | 20180201 |
| 2 | EFGH | 20180315 | 60 | 20180311 |
| 3 | ABCD | 20180412 | 62 | 20180411 |
--------------------------------------------------------
我需要的是服务表与暗表的左连接。 准则ON是两者共同的REF,然后是距ops_date最近的到达。 操作日期将始终在到达之后,这就是我需要始终在ops_date之前的日期。
我尝试什么:
SELECT
PK1,
REF,
ops_date,
PK2,
arrival
FROM
service
LEFT JOIN dim
ON service.REF = dim.REF
我想应该在此处添加一个条件,以找到左连接期间每个记录的最近日期
我不确定如果没有任何ETL或程序,这种想法是否可能实现,但是如果有人有线索,将不胜感激。
预先感谢您的帮助。
答案 0 :(得分:1)
您只需要向您的JOIN
添加一个条件,即条件Arrival
中的Dim
时间是最长Arrival
时间,小于相关的{{该Ops_Date
的1}}值。您可以通过相关的子查询找到该结果:
Service
输出:
SELECT s.*, d.PK2, d.Arrival
FROM Service s
LEFT JOIN Dim d ON d.REF = s.REF
AND d.Arrival = (SELECT MAX(Arrival)
FROM Dim d2
WHERE d2.REF = s.REF
AND d2.Arrival < s.Ops_Date)