MS Access SQL当有多个时,从分组字段中删除最大值

时间:2016-07-12 17:17:58

标签: sql ms-access access-vba

我在MS Access数据库上使用SQL查询,并有一个如下表:

Team           Country  City     Firstname  Surname     RecordedDateTime
Group Panda 7  USA      New York Jim        Smith       12/07/2016 09:10:06
Group Tiger 5  USA      Boston   Jack       Thompson    05/07/2016 19:15:21
Group Goat 12  USA      New York Jim        Smith       12/07/2016 09:10:06
Group Lion 9   France   Paris    Tom        Pryor       06/07/2016 10:10:08
Group Eagle 2  USA      New York Dale       Wycliff     12/07/2016 12:28:09
.....

现在,我试图删除记录:最新的日期/时间(最多不超过一个);拥有相同的国家,城市,名字和姓氏;那些没有" Panda"在团队中,或者如果没有" Panda"然后那些没有" Goat"在团队中,或者如果没有" Goat"然后那些没有"狮子"在团队中等等。所以对于Jim Smith,我想删除显示的第三条记录。

希望这是有道理的。到目前为止,我可以使用以下内容删除早于最新日期/时间的记录:

DELETE DISTINCTROW T1.* FROM Results T1 LEFT JOIN (SELECT Country, City, Firstname, Surname, MAX(RecordedDateTime) AS LatestTime
FROM Results GROUP BY Country, City, Firstname, Surname) T2 ON T1.Country = T2.Country AND T1.City = T2.City
AND T1.Firstname = T2.Firstname AND T1.Surname = T2.Surname WHERE T1.RecordedDateTime <> T2.LatestTime

但问题是处理多个最大值和部分字段的条件。

1 个答案:

答案 0 :(得分:1)

考虑使用render_403子句子查询将删除查询设为updateable,从而可删除。您的需求有点不寻常,因为您需要一个既不是数字也不是字符串排序的特定团队订单。因此,嵌套WHERE用于使用IIF()进行此类排序。

Pandas (lowest) < Tiger < Goat < Lion < Eagle (highest)

如果有更多团队订单,请添加到条件逻辑或更好地使用查找表与结果表连接。这样您就可以避免嵌套DELETE * FROM Results T1 WHERE (T1.RecordDateTime <> (SELECT MAX(RecordDateTime) AS LatestTime FROM Results sub WHERE sub.Country = T1.Country AND sub.City = T1.City AND sub.Firstname = T1.Firstname AND sub.Surname = T1.Surname GROUP BY Country, City, Firstname, Surname)) OR (NOT IIF(Team LIKE '*Panda*', 1, IIF(Team LIKE '*Tiger*', 2, IIF(Team LIKE '*Goat*', 3, IIF(Team LIKE '*Lion*', 4, IIF(Team LIKE '*Eagle*', 5, NULL))))) IN (SELECT MIN(IIF(Team LIKE '*Panda*', 1, IIF(Team LIKE '*Goat*', 2, IIF(Team LIKE '*Goat*', 3, IIF(Team LIKE '*Lion*', 4, IIF(Team LIKE '*Eagle*', 5, NULL)))))) FROM Results sub WHERE sub.Country = T1.Country AND sub.City = T1.City AND sub.Firstname = T1.Firstname AND sub.Surname = T1.Surname GROUP BY Country, City, Firstname, Surname)) ,只需使用 TeamValue

IIF()