2017-01-19 73 views
1

我會盡力解釋我的問題及其背後的數據。Microsoft Access SQL只返回記錄,其中一組分組記錄中的最後一條記錄等於另一列中的某條記錄

我有一個Microsoft Access中的表格,其結構如下。

ID1,ID2,數據1,數據2

ID1 - 是標識項的數場(1,2,3,4等)

ID2 - 是一個數字字段標識對該項目的更改(1,2,3,4等...) 這些都設置爲主鍵。記錄需要兩個ID纔是唯一的。

數據1 - 同樣的事情,只是一個數據字段 - 包含關於(用戶誰進行了更改名稱)

數據2的變化信息的數據字段。

我需要對此數據運行SQL查詢以返回Data1中的特定項目的所有記錄,其中ID1 = 1,ID2 =該集合中的最新記錄。

ID2在最後一行可能會有所不同。因此,如果ID1是1,那麼ID1可能有7個ID2,所以7是我需要檢查的行。在ID1等於2的情況下,可能有3個項目,所以現在我需要SQL來檢查第7行ID1 = 1和第3行ID1 = 2,以確定該行中的Data1是否等於某個名稱。

從我已經能夠研究它似乎我需要使用分組來獲得ID1s在一起,但是我無法找到我正在尋找的是獲得最大項目每組ID1的ID2。

這是我到目前爲止的地方。

SELECT ID1, Max(ID2), Data1, Data2 
FROM tbl_History 
WHERE Data1 = 'name' 
GROUP BY ID1 
ORDER BY ID2 DESC 

示例數據:

ID1 | ID2 | Data1 | Data2 
-------------------------------- 
1  1  Name1  32 
1  2  Name2  23 
1  3  Name3  63 
1  4  Name2  53 
2  1  Name4  12 
2  2  Name5  16 
2  3  Name2  71 

預期的結果是,如果我找名2從數據1我會得到兩排1-4和2-3。如果我在本例中查找Name5或2以外的任何其他名稱,我將不會收到任何行,因爲沒有最大ID2,它們的名稱是Data1列。

返回的錯誤是Data2不是聚合函數的一部分。我在技術上已經有Data1,所以我可以從返回的數據中取出它,但是如何根據我的上述要求檢索Data2。也許分組不是我需要去的方式。

我正在使用VB.NET通過OleDb連接訪問Microsoft Access數據庫。

任何幫助,將不勝感激。請讓我知道是否需要進一步的細節,我很樂意發佈。

+0

一般GROUP BY規則說:如果指定了GROUP BY子句,在SELECT列表中的每個列引用必須要麼確定分組列或者是一組函數的參數! – jarlh

+0

太好了,但是如果它是日期,文本或數字,我應該使用什麼函數從Data2檢索數據。這就是爲什麼我覺得分組不是要走的路。 –

+0

添加一些示例表數據和預期結果。 (以及格式化文本。) – jarlh

回答

1

where子句中使用相關子查詢:

select h.* 
from tbl_history as h 
where h.id2 = (select max(h2.id2) 
       from tbl_history as h2 
       where h.id1 = h2.id1 
      ); 
+0

這感覺就像我正在尋找,但我收到以下錯誤。 Microsoft Access數據庫引擎不會將'h。*'識別爲有效的字段名稱或表達式。我應該提到我正在使用VB.NET通過OleDb連接訪問Microsoft Access數據庫。如果我有另一種選擇,我會使用它,但這是我們公司給我們的。我會用這個信息更新原始問題。 –

+0

我的錯別字。原來我在tbl_history行結尾處忘了「as h」。這似乎正在按照需要工作。感謝您的快速反應,我爲我無法完全輸入給我的東西而道歉! :) –