2014-05-08 47 views
0

因此,我有一個跟蹤資產位置更改的數據庫。每次填寫表單時,它都會自動爲每個位置更改生成一個日期和時間戳。在Access中創建查詢以顯示序列號的最後一個條目

列看起來像這樣。

[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.我不使用任何舊資產跟蹤軟件的原因是,因爲這將在未來也將用於跟蹤這些資產的修復,回答這個問題也將幫助我稍後再做。

由於

~~~~~~增補上午12時35分5/8/2014年~~~~~~

由 「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 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]) 

這就是現在只顯示最後輸入到該表中。

再次感謝大家的幫助!

回答

0

創建一個新的查詢設計並切換到SQL視圖。複製如下內容:

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]

+0

看到這個我有點了解更好,但不幸的是它沒有奏效。我將相同的序列號放入我的數據庫中2次,一次在「準備好現場」位置和20分鐘。稍後在「現場」位置設置後,按照您解釋的方式顯示兩個條目。 – Ajster1989

+0

也許您可以在[sqlfiddle](http://sqlfiddle.com/) – geoB

+0

上發佈示例數據如果您重命名日期和時間字段,那麼會發生什麼情況,因爲這些字段名稱是保留字? – geoB

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以添加位置。
+0

在你的SQL中引用了什麼?我只設置了1個桌子。它是查詢本身嗎? – Ajster1989

+0

'MyTable A',在您的案例中(我更新了我的答案)將會是'[Casette Status History] ​​A'',意思是:以'MyTable'爲表,並從此稱爲'A'。這允許我們兩次選擇同一個表,其中A將外部SQL中的表和B指向內部SQL中的同一個表。 – Heinzi

+1

謝謝。我多年來一直在用第二種方法來做這件事 - 但總是想知道如何將所有事情合併成一個查詢。你的第一個解決方案告訴我該怎麼做。 –

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]); 

我這樣做是在設計視圖中通過首先製備,只有到「最大」那之後我在新位置字段添加顯示序列號與總設置爲「分組依據」和日期/時間設置表只需使用總計設置爲「第一」並按升序排列的額外信息即可。

現在,我看它,它似乎很簡單....

謝謝大家對你的幫助,我學到了很多!

相關問題