Фильтрация самой последней строки в запросе соединения - PullRequest
0 голосов
/ 24 октября 2018

У меня есть 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. Выбратьзаказы, в которых Страна = US
  2. Выберите отчеты, которые были частью этих заказов США (т. е. идентификатор заказа = идентификатор заказа из приведенного выше результата)
  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 голосов
/ 24 октября 2018

Чтобы найти последний отчет для каждого здания, это хитрость здесь.Во-первых, вам нужно найти дату последнего отчета, например:

               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 to JOIN.

Если вы хотите отфильтровать этот результирующий набор, добавьте WHERE o.Country = 'US' (или фильтр по вашему выбору) в конец запроса. Затем вы можете использовать ORDER BY для сортировки результатаустановите, если это то, что вам нужно.

Хитрость заключается в том, чтобы построить запрос изнутри.

Кстати, это называется наибольшее n на группу шаблон.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...