只显示访问查询中的最后一个副本
问题描述:
我有一个数据库访问,我登录地图,我借出。因此,我有一个名为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;
任何帮助将不胜感激。
在此先感谢
答
与查询开始寻找每一个[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;
这应该给你想要的东西。 内部查询获取具有最新结帐日期的记录,即他的签入不为空。其余的只是一个地图加入。
注:该演示是在SQL服务器,但我看不出有任何理由它不会在访问工作。
向我们展示查询给你一个问题,也许有人可以修改它。 – BWS
刚刚添加了代码 – theWolf