У меня есть набор данных, который имеет несколько полей, список ниже, и некоторые из них усечены для моего примера.
C_ID O_ID C_O_ID PoP PoP_End Status Type Completion_ Date
WAB 0034 WAB-0034 09/25/2017 - 05/30/2018 05/30/2018 Started Interim 03/30/2019
WAB 0034 WAB-0034 09/25/2018 - 05/30/2019 03/30/2019 Started Final 03/30/2019
YSF ZA03 YSF-ZA03 06/01/2016 - 11/30/2016 11/30/2016 Completed Final 09/30/2016
WDN PO43 WDN-PO43 09/15/2016 - 10/18/2017 10/18/2017 Pending Interim 01/18/2020
WDN PO43 WDN-PO43 09/15/2017 - 10/18/2018 10/18/2018 Pending Interim 01/18/2020
POD POD 08/10/2015 - 04/26/2016 04/26/2016 Pending Interim 01/18/2019
POD POD 08/10/2015 - 04/26/2016 01/18/2019 Pending Final 01/18/2019
DZE SE95 DZE-SE95 10/01/2017 - 09/30/2018 07/15/2018 Completed Final 07/15/2018
SDF PE34 SDF-PE34 09/25/2015 - 05/30/2016 05/30/2016 Started Interim 05/30/2016
SDF PE34 SDF-PE34 06/01/2016 - 11/30/2016 05/30/2016 Completed Final 05/30/2016
C_O_ID
- это объединение C_ID
и O_ID
.
PoP_End
- это формула, которая гласит: «If(Type = "Final", Completion_Date, Right(PoP,10))
(последняя дата в диапазоне дат в поле PoP).
Вот правила:
C_O_ID
становится моей ключевой областью, которую я использую, чтобы искать все и делать свой анализ. В этом поле могут быть дубликаты, которые я пытаюсь удалить с помощью приведенной ниже логики.
Чтобы получить уникальный C_O_ID
, я использую MAX(PoP_End)
.
Query1
SELECT C_O_ID, MAX(PoP_End) AS Max_PoP_End
FROM table
GROUP BY C_O_ID
Затем я использую LEFT JOIN
для ввода других данных
SELECT q.C_O_ID, q.Max_PoP_End, t.PoP, t.Status, t.Type, t.CompletionDate
FROM Query1 q LEFT JOIN table t
ON query1.C_O_ID = table.C_O_ID AND query1.Max_PoP_End = table.PoP_End
Однако я сталкиваюсь с проблемами, потому что иногда происходит из-за оператора If
, который я должен вычислить PoP_End
в table
, есть дублирующая комбинация C_O_ID
и PoP_End
.
Мой первый SQL-запрос великолепен. Я получаю следующее.
C_O_ID PoP_End
WAB-0034 03/30/2019
YSF-ZA03 11/30/2016
WDN-PO43 10/18/2018
POD 01/18/2019
DZE-SE95 07/15/2018
SDF-PE34 05/30/2016
Однако, как только я оставил объединение, так как теперь есть повторяющиеся совпадения для SDF-PE34
, оно будет дублировать его при соединении так, как я это делаю.
Поскольку мне нужен уникальный список C_O_ID
на основе последних PoP_End
, и я хочу ввести все остальные поля, я не совсем знал, как это сделать с помощью агрегатных функций или объединения таблиц и сохранить уникальный список C_O_ID
со всеми данными строки для этого последнего PoP_End
. Кроме того, если Type
= "Финал" и Status
= Завершено и RIGHT(PoP,10)
МЕНЬШЕ, ЧЕМ Completion_Date
.
Я бы хотел, чтобы мои результаты были следующими.
C_ID O_ID C_O_ID PoP Max_PoP_End Status Type Completion_Date
WAB 0034 WAB-0034 09/25/2018 - 05/30/2019 03/30/2019 Started Final 03/30/2019
WDN PO43 WDN-PO43 09/15/2017 - 10/18/2018 10/18/2018 Pending Interim 01/18/2020
POD POD 08/10/2015 - 04/26/2016 01/18/2019 Pending Final 01/18/2019
DZE SE95 DZESE95 10/01/2017 - 09/30/2018 07/15/2018 Completed Final 07/15/2018
SDF PE34 SDF-PE34 06/01/2016 - 11/30/2016 05/30/2016 Completed Final 05/30/2016
Пожалуйста, дайте мне знать, если у вас есть какие-либо вопросы или моя логика не ясна.