过滤掉联接查询中的最新行

时间:2018-10-24 10:27:26

标签: mysql join jointable groupwise-maximum

我有2个表,其中包含以下信息。不幸的是,我对JOINS和MySQL的基本了解并不能帮助我达到所需的结果集……尤其是第3点使我难以理解。任何帮助将不胜感激。

订单

OrderID     OrderDate   Client      Country 

68349       1/1/2018    GSC Ltd     US
93909       1/1/2018    XYZ Ltd     UK
39900       3/31/2018   ABC Ltd     US
69382       4/4/2018    ABC Ltd     US
94500       6/21/2018   DEF Ltd     US
93911       1/1/2018    TUV Ltd     UK

报告

RepID   State   RepDate     Building    OrderID

1   AK  1/1/2018    PE James    93909
2   CA  4/2/2018    PE Grid     93909
3   CA  3/31/2018   PMU Jaya    39900
4   WA  4/4/2018    PMU Taman   69382
5   CA  6/21/2018   PE Grid     94500
6   CA  3/31/2018   PMU Wate    39900

我需要根据选择所有内容:

  1. 选择国家/地区为美国的订单
  2. 选择属于这些美国订单的报告(即,订单ID =上面结果中的订单ID)
  3. 最重要的是:过滤报告的结果,以便仅显示每个建筑物的单个最新报告(基于最新的RepDate)

结果将是:

OrderID     OrderDate   Client      Country     RepID   RepDate     Building 

68349       1/1/2018    GSC Ltd     US      -   -       -
39900       3/31/2018   ABC Ltd     US      3   3/31/2018   PMU Jaya
69382       4/4/2018    ABC Ltd     US      4   4/4/2018    PMU Taman
94500       6/21/2018   DEF Ltd     US      5   6/21/2018   PE Grid

由于没有关于“ PE Grid”的最新报告,因此以下结果将被排除

OrderID     OrderDate   Client      Country     RepID   RepDate     Building 

39900       3/31/2018   ABC Ltd     US      6   3/31/2018   PE Grid

1 个答案:

答案 0 :(得分:0)

在这里找到每个建筑物的最新报告是一个窍门。首先,您需要像这样查找最新报告的日期。

               SELECT MAX(RepDate) RepDate, Building
                 FROM reports
                GROUP BY RepDate

GROUP BY保证每个建筑物在这里只有一行。

然后,您需要将该查询视为虚拟表并将其联接。 (http://sqlfiddle.com/#!9/ade437e/2/0

SELECT o.OrderID, o.OrderDate, o.Client, o.Country,
       r.RepId, r.RepDate, r.Building
  FROM orders o
  LEFT JOIN reports r ON o.OrderID = r.OrderID
  LEFT JOIN ( SELECT MAX(RepDate) RepDate, Building
                FROM reports
                GROUP BY RepDate
            ) m ON r.RepDate = m.RepDate AND r.Building = m.Building

请注意此处使用LEFT JOIN。这意味着没有匹配报告的订单仍将显示在结果集中。如果您不希望这些订单,请将LEFT JOIN更改为JOIN

如果要过滤该结果集,请在查询的末尾添加WHERE o.Country = 'US'(或您选择的过滤器)。然后,您可以根据需要使用ORDER BY对结果集进行排序。

诀窍是从内到外构建查询。

顺便说一下,这称为greatest n per group模式。