在Access中创建查询以显示序列号的最后一个条目

时间:2014-05-08 02:11:19

标签: ms-access ms-access-2013

所以我有一个跟踪资产位置变化的数据库。每次填写表单时,它会自动为每个位置更改日期和时间戳。

列看起来像这样。

[Serial Number][New Location][Date][Time]

示例是“

[DE1234567][Warehouse][5/7/2014][10:02PM]

我现在要做的是创建一个查询,向我显示当前位于这些位置的所有资产。

[Location1][serial1][Date/Time]
[Location1][serial2][Date/Time]
[Location1][serial5][Date/Time]
[Location1][serial7][Date/Time]
[Location2][serial4][Date/Time]
[Location2][serial6][Date/Time]
[Location2][serial8][Date/Time]
[Location2][serial9][Date/Time]

或者那些东西。

我需要做的是获取查询以查找每个序列号的最后日期条目,并仅显示该条目并忽略更旧的条目。我不能删除旧的,因为我需要历史资产。

P.S。我不使用任何旧的资产跟踪软件的原因是因为将来这也将用于跟踪这些资产的内部修复,并回答这个问题也将帮助我稍后这样做。

由于

~~~~已添加2014年5月8日上午12:35 ~~~~

通过“GeoB”的回答尝试了这段代码。仍然显示刚刚排序的相同数据。

SELECT [Cassette Status History].[New Location], [Cassette Status History].[Serial Number], Max([Cassette Status History].[Date/Time]) AS [Last Date/Time]
FROM [Cassette Status History]
GROUP BY [Cassette Status History].[New Location], [Cassette Status History].[Serial Number];

这显示所有条目只是排序和分组。我希望此查询隐藏来自相同序列号的所有条目,但隐藏具有最新日期的条目。

~~~~新增9:29 PM 5/8/2014 ~~~~

我按照“Heinzi”的答案尝试了这段代码

SELECT [Cassette Status History].[New Location], [Cassette Status History].[Serial Number], [Cassette Status History].[Date/Time]
  FROM [Cassette Status History]
 WHERE [Cassette Status History].[Date/Time] = (SELECT MAX([Cassette Status History].[Date/Time])
                          FROM [Cassette Status History]
                         WHERE [Cassette Status History].[Serial Number] = [Cassette Status History].[Serial Number])

现在只显示输入该表的最后一个条目。

再次感谢大家的帮助!

3 个答案:

答案 0 :(得分:1)

您希望此序列号的Date/Time最高值的所有记录。所以让我们直接将它翻译成SQL:

SELECT A.[New Location], A.[Serial Number], A.[Date/Time]
  FROM [Cassette Status History] A
 WHERE A.[Date/Time] = (SELECT MAX(B.[Date/Time])
                          FROM [Cassette Status History] B
                         WHERE A.[Serial Number] = B.[Serial Number])

或者,如果您想使用查询设计器,可以将问题分解成更小的部分:

  • 创建一个查询LastMovements,其中仅包含Serial Number和该序列号的最大Date/Time。这与您已有的查询类似,只是没有位置。
  • 然后创建一个新的查询,将LastMovement加入Cassette Status History以添加位置。

答案 1 :(得分:0)

创建新的查询设计并切换到SQL View。复制如下:

SELECT yourtable.[New Location], yourtable.[Serial Number], Max([yourtable.Date]+[yourtable.Time]) AS Timestamp
FROM yourtable
GROUP BY tTest.[New Location], tTest.[Serial Number];

添加日期和时间字段以创建完整的时间戳。

在设计视图中,您将看到如何构建查询。

[注意:以上假设ACC2013与ACC2010基本相似]

答案 2 :(得分:0)

我能够弄清楚。花了我几个小时玩它,但至少我现在因为它而变得更聪明。

这是我正在使用的代码。

SELECT First([Cassette Status History].[New Location]) AS [FirstOfNew Location], [Cassette Status History].[Serial Number], Max([Cassette Status History].[Date/Time]) AS [MaxOfDate/Time]
FROM [Cassette Status History]
GROUP BY [Cassette Status History].[Serial Number]
ORDER BY First([Cassette Status History].[New Location]);

我在设计视图中做了这个,首先制作的表只显示序列号,总计设置为" Group By"和日期/时间设置为" Max"之后我在新位置字段中添加了额外信息,使用总计设置为" First"并按升序排序。

现在我正在看它似乎很简单......

感谢大家的帮助,我学到了很多东西!