2008-09-06 14 views
2

這是常見的有一個表,其中例如字段是帳戶,價值和時間。用於檢索每個帳戶最後一個值的最佳設計模式是什麼?不幸的是,分組中的最後一個關鍵字爲您提供了數據庫中的最後一個物理記錄,而不是任何排序中的最後一個記錄。這意味着恕我直言,它永遠不應該被使用。我使用的兩種笨拙方法是子查詢方法或輔助查詢來確定最後一條記錄,然後加入表中查找值。沒有更優雅的方法嗎?去年價值MS-訪問設計模式的分組

回答

1

子查詢選項聽起來對我來說最好,就像下面的psuedo-sql一樣。可能/有必要通過連接來優化它,這取決於SQL引擎的功能。

select * 
from table 
where account+time in (select account+max(time) 
         from table 
         group by account 
         order by time) 
1

你能不能做:

select account,last(value),max(time) 
from table 
group by account 

我測試了這個(授予一個非常小的,幾乎是微不足道的記錄集)和它產生正確的結果。

編輯:

這也不能在一些更多的測試後工作。在過去的一段時間裏,我做了一些相關的訪問編程,並且覺得有一種方法可以完成你在一個查詢中所要求的內容,但是現在我要畫一個空白。抱歉。

1

這是在一個表中返回的最後一條記錄良好的招:

SELECT TOP 1 * FROM TableName ORDER BY Time DESC 

更多信息退房this site

0

@shs
是的,選擇最後一個(價值)應該工作,但它不會......我的理解,雖然我不能產生權威的來源是最後一個(價值)給出了最後的物理記錄在訪問文件中,這意味着它可能是第一個時間,但最後一個是物理上的。所以我不認爲你應該使用最後(價值)除了一個非常糟糕的隨機行之外的任何東西。

1

@Tom 對於我來說,執行您建議的「In」查詢可能會更容易。一般我做類似

select T1.account, T1.value 
from table T as T1 
where T1 = (select max(T2.time) from table T as T2 where T1.account = T2.Account) 
0

也許下面的SQL很笨拙,但它似乎在Access中正常工作。

SELECT 
    a.account, 
    a.time, 
    a.value 
FROM 
    tablename AS a INNER JOIN [ 
     SELECT 
      account, 
      Max(time) AS MaxOftime 
     FROM 
      tablename 
    GROUP BY 
     account 
    ]. AS b 
    ON 
     (a.time = b.MaxOftime) 
     AND (a.account = b.account) 
; 
0

我試圖找到使用Access 2003查詢生成器在一組最新的日期,並跑進試圖用持續日期字段同樣的問題。但它看起來像使用MAX查找lates日期。

0

後字面上年搜索的我終於找到了答案低於#3的鏈接。上面的子查詢將起作用,但速度非常慢 - 對我的目的來說,速度減慢。

更受歡迎的答案是三級查詢:第一級查找最大值,第二級查找基於第一查詢的字段值。然後將結果作爲表格連接到主查詢。編碼/維護快速但複雜且耗時。

這個鏈接工作,仍然運行得非常快,而且代碼/維護工作量少得多。感謝這個網站的作者。

http://access.mvps.org/access/queries/qry0020.htm