SQL聚合函数MAX通过连接删除重复项

SQL聚合函数MAX通过连接删除重复项,sql,ms-access,Sql,Ms Access,我有一张桌子,上面写着: 我想提取与每个客户机相关的最后一个数据,但我对重复数据有问题。 我的SQL查询是: SELECT * FROM tblAccess AS t1 INNER JOIN (SELECT lClientID, MAX(datAccess) AS datLastDate FROM tblAccess GROUP BY lClientID) AS t2 ON t1.lClientID = t2.lClientID AND t1.datAccess = t2.datLastDate

我有一张桌子,上面写着:

我想提取与每个客户机相关的最后一个数据,但我对重复数据有问题。 我的SQL查询是:

SELECT * FROM tblAccess AS t1 INNER JOIN (SELECT lClientID, MAX(datAccess) AS datLastDate FROM tblAccess GROUP BY lClientID) AS t2 ON t1.lClientID = t2.lClientID AND t1.datAccess = t2.datLastDate
我所拥有的:

+--------------+-------+------------+--------------+-------------+
| t1.lClientID | lData | datAccess  | t2.lClientID | datLastDate |
+--------------+-------+------------+--------------+-------------+
|            1 | test2 | 08.06.2019 |            1 |  08.06.2019 |
|            2 | test3 | 15.06.2019 |            2 |  15.06.2019 |
|            2 | test4 | 15.06.2019 |            2 |  15.06.2019 |
+--------------+-------+------------+--------------+-------------+
我需要删除重复项,它应该选择任何项test4/test3-这无关紧要:

+--------------+-------+------------+--------------+-------------+
| t1.lClientID | lData | datAccess  | t2.lClientID | datLastDate |
+--------------+-------+------------+--------------+-------------+
|            1 | test2 | 08.06.2019 |            1 |  08.06.2019 |
|            2 | test4 | 15.06.2019 |            2 |  15.06.2019 |
+--------------+-------+------------+--------------+-------------+
提前谢谢

任何物品都可以

这应该行得通

SELECT t1.lClientID, Max(t1.lData), Max(t1.datAccess), t2.lClientID, t2.datLastDate 
FROM tblAccess AS t1 INNER JOIN 
(SELECT lClientID, MAX(datAccess) AS datLastDate FROM tblAccess GROUP BY lClientID) 
AS t2 ON t1.lClientID = t2.lClientID AND t1.datAccess = t2.datLastDate
GROUP BY t1.lClientID, t1.datAccess, t2.lClientID, t2.datLastDate
使用“不存在”获取数据访问量最大的行,如果lData不重要,则通过获取最大值或最小值来删除重复项(如果有):

没有必要像您使用的联接那样再次返回列,对吗?您只需要表中的3列。 结果:


您可以使用“不存在”筛选结果:


注意:这不会返回最后两列,这两列似乎与前两列重复。

现在知道您的表有一个主键Id,问题可以这样解决:

SELECT lClientID, lData, datAccess FROM tblAccess
WHERE Id IN (
  SELECT TOP 1 Id FROM tblAccess AS tmp
  WHERE lClientID = tblAccess.lClientID
  ORDER BY datAccess DESC, Id DESC
);

顺便说一句,大家好。论坛将其从主帖子中删除,如果lData字段不重要,为什么要将其包含在输出中?为什么在多个列中需要相同的数据?带有GROUP BY的简单聚合查询将返回每个lClientID的最长日期。我在您的帖子中添加了一个DbFidle,在输出中只看到两行。不清楚你想要什么。@Luuk:你的小提琴是基于字符串的,不是datesOk,这个用的是日期:。另外,查询返回John要求的值。感谢您的回复!我将使用这个解决方案。我想问另一个问题-如果表有两个字段lData和lData2,并且我需要返回这两个字段,如何更改查询?提前谢谢你!如果列值是否来自同一行并不重要,则将maxlData2添加到选择列表中。如果希望两个列值来自同一行,则需要在子查询中包含更多条件,例如Gordon的答案。如果还有其他列,那么这些条件应该进一步扩展。但对于这种情况,一个合适的解决方案是在每一行中都有一个唯一的类似于id的列,用于标识每一行。谢谢您的回复。我会考虑戈登的解决方案!当你发布一个问题时,你应该期待你所设定要求的答案。更改原始问题的要求会使您得到的答案无效。事情不是这样的,对不起。只是原始表有许多字段,我想简化表。再次抱歉。如果lData有空值,如何使用您的查询?因为在本例中,它返回2行。提前谢谢你!解决了的。我使用了下一个查询:从tblAccess中选择一个*作为不存在的地方,从tblAccess中选择1作为a2,其中a2.lClientID=a.lClientID和a2.dataaccess>a.dataaccess或a2.dataaccess=a.dataaccess和a2.Id>a.Id ;
SELECT t.lClientID, MAX(t.lData) AS lData, t.datAccess 
FROM tblAccess AS t
WHERE NOT EXISTS (
  SELECT 1 FROM tblAccess
  WHERE lClientID = t.lClientID AND datAccess > t.datAccess 
)
GROUP BY t.lClientID, t.datAccess
lClientID   lData   datAccess
1           test2   8/6/2019
2           test4   15/6/2019
select a.*
from tblAccess as a
where not exists (select 1
                  from tblAccess as a2
                  where a2.lClientID = a.lClientID and
                        (a2.datAccess > a.datAccess or
                         (a2.datAccess = a.datAccess and
                          a2.ldata > a.ldata
                         )
                        )
                 );
SELECT lClientID, lData, datAccess FROM tblAccess
WHERE Id IN (
  SELECT TOP 1 Id FROM tblAccess AS tmp
  WHERE lClientID = tblAccess.lClientID
  ORDER BY datAccess DESC, Id DESC
);