过滤出连接查询中最近的行

3pmvbmvn  于 2021-06-18  发布在  Mysql
关注(0)|答案(1)|浏览(312)

我有两张表,上面有以下信息。不幸的是,我对joins&mysql的基本知识并不能帮助我实现所需的结果集。。。特别是第三点,我无法理解。非常感谢您的帮助。
订单

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

我需要选择所有基于:
选择国家/地区=美国的订单
选择作为这些美国订单一部分的报告(即订单id=来自上述结果的订单id)
最重要的是:过滤报告的结果,使其仅显示每个建筑的单个最新报告(基于最近的报告日期)
结果是:

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
nzrxty8p

nzrxty8p1#

找到每栋楼的最新报告是这里的诀窍。首先,你需要找到最新报告的日期,像这样。

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

分组保证每个建筑只有一行。
然后您需要将该查询视为一个虚拟表并连接到它(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每组模式。

相关问题