Фильтрация строк с дублирующимися значениями в определенных полях на основе нескольких критериев - PullRequest
0 голосов
/ 25 апреля 2019

У меня есть набор данных, который имеет несколько полей, список ниже, и некоторые из них усечены для моего примера.

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

Пожалуйста, дайте мне знать, если у вас есть какие-либо вопросы или моя логика не ясна.

Ответы [ 2 ]

0 голосов
/ 27 апреля 2019

My Query1 (я назвал вашу таблицу Monkey)
SELECT Monkey.C_O_ID, Max (Monkey. [Pop_end]) AS Max_Pop_End, Last (Monkey.Status) AS LastOfStatus ИЗ ГРУППЫ Monkey BY BY Monkey.C_O_ID; Мой запрос2 ВЫБРАТЬ Query1.C_O_ID, Monkey.Pop, Monkey.Pop_end, Monkey.Status, Monkey.Type, Monkey.Complettion_Date FROM Query1 ВЕРНУТЬСЯ ОБЪЕДИНИТЬ Мартышку ВКЛ (Query1.Max_Pop_End = Monkey.Pop_e).C_O_ID = Monkey.C_O_ID); Мой Query3 (необходим, поскольку Access SQL имеет проблемы с несколькими внешними объединениями) SELECT Query2.C_O_ID, Query2.Pop, Query2.Pop_end, Query2.Status, Query2.Type, Query2.Complettion_Date FROM Query1 ВЛЕВО ВСТУПИТЬ Query2 ON (Query1.Max_Pop_End = Query2.Pop_end) И (Query1.C_O_ID = Query2.C_O_ID) AND (Query1.LastOfStatus = Query2.Status); Мои результаты были результатами, которые вы искали,Я использовал Last of Status, потому что считаю, что ваши данные отсортированы.Это нужно будет.Вы можете выбрать использовать тип.Но я думаю, что это идея, и вы должны ее адаптировать.

0 голосов
/ 26 апреля 2019

Как насчет включения статуса в запрос 1 и максимизации статуса, путем его кодификации или фактического сравнения. Затем, когда вы вышли из группы, вы можете включить статус и получить последний статус на самую последнюю дату.

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