-2

我有 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
4

1 回答 1

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 JOINJOIN.

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

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

顺便说一下,这被称为每组最大 n模式。

于 2018-10-24T10:47:27.193 回答