我有一个包含多个字段的数据集,下面列出,对于我的示例,其中一些被截断。
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
的{{1}}的唯一列表,并且想引入所有其他字段,因此我不确定如何使用聚合函数或联接表来实现并保留唯一的PoP_End
列表以及最新C_O_ID
的所有行数据。另外,如果PoP_End
=“最终”并且Type
=完成并且Status
小于RIGHT(PoP,10)
。
我希望得到的结果如下。
Completion_Date
如果您有任何疑问或我的逻辑不清楚,请告诉我。
答案 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);
我的结果就是您要寻找的结果。我之所以使用状态最后一个,是因为我相信您的数据是经过排序的。一定会的。您可以选择使用类型。但是我认为这是个主意,您应该能够适应它。