SQL聚合函数MAX通过连接删除重复项
我有一张桌子,上面写着: 我想提取与每个客户机相关的最后一个数据,但我对重复数据有问题。 我的SQL查询是: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
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
);