根据多个条件过滤某些字段中具有重复值的行

时间:2019-04-25 20:10:12

标签: sql ms-access

我有一个包含多个字段的数据集,下面列出,对于我的示例,其中一些被截断。

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_IDC_IDO_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的{​​{1}}的唯一列表,并且想引入所有其他字段,因此我不确定如何使用聚合函数或联接表来实现并保留唯一的PoP_End列表以及最新C_O_ID的所有行数据。另外,如果PoP_End =“最终”并且Type =完成并且Status小于RIGHT(PoP,10)

我希望得到的结果如下。

Completion_Date

如果您有任何疑问或我的逻辑不清楚,请告诉我。

2 个答案:

答案 0 :(得分:0)

如何将状态包含在查询1中并通过将其编码或进行实际比较来最大化状态。 然后,当您退出加入会议时,您可以包括该状态并在最新日期获得最新状态。

答案 1 :(得分:0)

我的Query1(我将您的表命名为Monkey)
选择Monkey.C_O_ID,最大值(猴子。[Pop_end])作为Max_Pop_End,姓氏(Monkey.Status)作为LastOfStatus,来自Monkey GROUP BY Monkey.C_O_ID; 我的查询2 选择Query1.C_O_ID,Monkey.Pop,Monkey.Pop_end,Monkey.Status,Monkey.Type,Monkey.Complettion_Date从Query1左联接Monkey ON(Query1.Max_Pop_End = Monkey.Pop_end)AND(Query1.C_O_ID = Monkey。 C_O_ID); 我的Query3(需要使用Access SQL进行多个外部联接时遇到问题) 选择Query2.C_O_ID,Query2.Pop,Query2.Pop_end,Query2.Status,Query2.Type,Query2.Complettion_Date从Query1左联接Query2 ON(Query1.Max_Pop_End = Query2.Pop_end)和(Query1.C_O_ID = C_O_ID)AND(Query1.LastOfStatus = Query2.Status); 我的结果就是您要寻找的结果。我之所以使用状态最后一个,是因为我相信您的数据是经过排序的。一定会的。您可以选择使用类型。但是我认为这是个主意,您应该能够适应它。