首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在Access中创建查询以显示序列号的最后一个条目

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

Stack Overflow用户
提问于 2014-05-08 10:11:19
回答 3查看 2.1K关注 0票数 0

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

列看起来像这样。

代码语言:javascript
复制
[Serial Number][New Location][Date][Time]

例如:“

代码语言:javascript
复制
[DE1234567][Warehouse][5/7/2014][10:02PM]

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

代码语言:javascript
复制
[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]

或者其他类似的东西。

我需要做的是让查询找到每个序列号的最后一个日期条目,并且只显示该条目,而忽略任何较旧的条目。我不能删除旧的,因为我需要每个资产的历史记录。

附注:我不使用任何旧的资产跟踪软件的原因是,在未来,这也将用于跟踪这些资产的内部维修,回答这个问题也将有助于我以后这样做。

谢谢

2014年5月8日12:35

通过"GeoB“从答案中尝试了此代码。仍然显示刚刚排序的相同数据。

代码语言:javascript
复制
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];

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

增加了2014年5月8日9:29

我根据"Heinzi“的回答尝试了这个代码。

代码语言:javascript
复制
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])

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

再次感谢大家的帮助!

EN

回答 3

Stack Overflow用户

发布于 2014-05-08 13:18:07

您需要Date/Time是此序列号的最高值的所有记录。因此,让我们将其直接转换为SQL:

代码语言:javascript
复制
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
EN

Stack Overflow用户

发布于 2014-05-08 11:45:35

创建新的查询设计并切换到SQL视图。复制以下内容:

代码语言:javascript
复制
SELECT yourtable.[New Location], yourtable.[Serial Number], Max([yourtable.Date]+[yourtable.Time]) AS Timestamp
FROM yourtable
GROUP BY tTest.[New Location], tTest.[Serial Number];

添加日期和时间字段以构成完整的时间戳。

在Design View中,您将看到如何构建查询。

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

票数 0
EN

Stack Overflow用户

发布于 2014-05-09 12:14:16

我能够弄明白这一点。我花了几个小时玩它,但至少我现在因为它变得更聪明了。

这是我正在使用的代码。

代码语言:javascript
复制
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]);

我在设计视图中这样做,首先制作了一个只显示序列号的表,其中Total设置为"Group By“,日期/时间设置为"Max”,然后我在New Location字段中添加了额外的信息,使用设置为" first“的合计,并按升序排序。

现在我看到它似乎真的很简单……

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/23531570

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档