根据几个“主日期”查找存储在另一个表中的最近日期,这些数据是公用的,但没有ID

时间:2019-05-09 12:36:33

标签: mysql datetime left-join

对不起,标题很难用几句话来解释(这表明我并不完全理解问题)。

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或程序,这种想法是否可能实现,但是如果有人有线索,将不胜感激。

预先感谢您的帮助。

1 个答案:

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

Demo on dbfiddle