只显示访问查询中的最后一个副本

问题描述:

我有一个数据库访问,我登录地图,我借出。因此,我有一个名为MapsOut的表,其中包含字段,MapNum(地图ID),MapName(地图名称),CheckOut(地图借出日期),CheckIn(返回地图日期)。只显示访问查询中的最后一个副本

MapNum MapName CheckOut CheckIn 
1  London 01/02/13 07/05/13 
1  London 08/05/13 16/06/13 
1  London 19/07/13 
2  Hull 30/01/13 05/03/13 
2  Hull 06/04/13 01/05/13 
3  Derby 11/01/13 17/02/13 
3  Derby 05/09/13 06/10/13 
4  Hove 01/02/13 01/03/13 

我想编写一个查询,让我只有每个MapNum的最后一个记录,但只显示那些在检查回来,所以我知道这是从过去的,而在最近的顺序最长时间之前,在CheckOut列中。所以结果应该是这样的:

MapNum MapName CheckOut CheckIn 
4  Hove 01/02/13 01/03/13 
2  Hull 06/04/13 01/05/13 
3  Derby 05/09/13 06/10/13 

我已经做了查询,但我不能让SELECT DISTINCT工作,因为它仍然显示重复。

这是不工作:

SELECT DISTINCT Maps.MapNum AS MapNum, Maps.MapName, Max(MapsOut1.CheckOut) AS CheckOut, MapRecords.CheckIn 
FROM (MapRecords INNER JOIN Maps ON MapRecords.MapNum = Maps.MapNum) INNER JOIN (MapsOut INNER JOIN MapsOut1 ON MapsOut.ID = MapsOut1.ID) ON Maps.MapNum = MapsOut.MapNum 
GROUP BY Maps.MapNum, Maps.MapName, MapRecords.CheckIn 
HAVING (((MapRecords.CheckIn) Is Not Null)) 
ORDER BY Maps.MapNum; 

任何帮助将不胜感激。

在此先感谢

+1

向我们展示查询给你一个问题,也许有人可以修改它。 – BWS

+0

刚刚添加了代码 – theWolf

与查询开始寻找每一个[MapNum]

SELECT MapNum, Max(CheckOut) AS MaxOfCheckOut 
FROM MapData 
GROUP BY MapNum 

的最新条目返回

MapNum MaxOfCheckOut 
------ ------------- 
    1 2013-07-19 
    2 2013-04-06 
    3 2013-09-05 
    4 2013-02-01 

,我们可以使用它作为一个子查询返回其余字段为每个那些行中,但只有当[签入]不为空

SELECT md.MapNum, md.MapName, md.CheckOut, md.CheckIn 
FROM 
    MapData md 
    INNER JOIN 
    (
     SELECT MapNum, Max(CheckOut) AS MaxOfCheckOut 
     FROM MapData 
     GROUP BY MapNum 
    ) AS mx 
     ON md.MapNum = mx.MapNum 
      AND md.CheckOut = mx.MaxOfCheckOut 
WHERE md.CheckIn IS NOT NULL 
ORDER BY md.CheckOut DESC 

返回

MapNum MapName CheckOut CheckIn 
------ ------- ---------- ---------- 
    3 Derby 2013-09-05 2013-10-06 
    2 Hull  2013-04-06 2013-05-01 
    4 Hove  2013-02-01 2013-03-01 
+0

马上就工作了!我之前用子查询遗漏了Inner Join – theWolf

尝试是这样的:

SELECT m.MapNum AS MapNum, 
    m.MapName AS MapName, 
    mr.CheckOut AS CheckOut, 
    mr.CheckIn AS CheckIn 
FROM maps m 
INNER JOIN (
    SELECT t1.* 
    FROM MapsRecords t1 
    LEFT JOIN MapsRecords t2 ON t1.MapNum = t2.MapNum 
    AND t1.checkOut < t2.checkOut 
    WHERE t2.checkOut IS NULL 
    AND t1.CheckIn IS NOT NULL 
) mr ON m.MapNum = mr.MapNum; 

这应该给你想要的东西。 内部查询获取具有最新结帐日期的记录,即他的签入不为空。其余的只是一个地图加入。

sqlfiddle demo in sql-server

注:该演示是在SQL服务器,但我看不出有任何理由它不会在访问工作。