2011-07-21 180 views
1

我正在使用MS訪問。 我有列MS Access查詢

(CNO (int) , TNO (int), DATE_C). 

我想寫僅顯示通過CNO最近的日期和組它的SQL查詢的表名爲變化。但我也想顯示TNO。

SELECT tno, cno, max(date_c) 
FROM changes 
WHERE [Date_c] In (SELECT [date_c] FROM changes WHERE [date_c]<=[Enter date]) 
GROUP BY cno; 

回答

0

大約有七種方式在SQL做到這一點(因爲總是存在:),是一個經常被問到的問題#2。這是一個:(我,因爲我不能省略測試你的date_c <= [Enter date]參數的清晰度和 - 我不使用接入接口!):

SELECT DISTINCT C1.tno, C1.cno, 
     DT1.c_most_recent_date 
    FROM changes AS C1 
     INNER JOIN (
        SELECT C2.cno, 
          MAX(C2.c_date) AS c_most_recent_date 
        FROM changes AS C2 
        GROUP 
         BY C2.cno 
       ) AS DT1 
      ON C1.cno = DT1.cno; 
     AND C1.c_date = DT1.c_most_recent_date; 

而這裏的另一個:

SELECT DISTINCT C1.tno, C1.cno, 
     C1.c_date AS c_most_recent_date 
    FROM changes AS C1 
WHERE NOT EXISTS (
        SELECT * 
        FROM changes AS C2 
        WHERE C2.cno = C1.cno 
          AND C1.c_date < C2.c_date 
       ); 
+0

非常感謝。這是一個很好的幫助:)它解決了我的問題。 – Sunshine

0

這沒有意義。你不能顯示TNO如果如果你正在爲分組它CNO可能是相同CNO不同。如果你想顯示任何TNO,你可以這樣做:

SELECT FIRST(tno), cno, max(date_c) 
FROM changes 
WHERE [Date_c] In (SELECT [date_c] FROM changes WHERE [date_c]<=[Enter date]) 
GROUP BY cno; 

或本:

SELECT LAST(tno), cno, max(date_c) 
FROM changes 
WHERE [Date_c] In (SELECT [date_c] FROM changes WHERE [date_c]<=[Enter date]) 
GROUP BY cno; 

但通常要分組雙方,如果你想同時顯示。 (即使你說你不想)。

+0

這對我來說很有意義,我會試着解釋如何:)考慮一個客戶姓名的'歷史'表,其中帶有序列鍵的'{customer_ID,customer_name,start_date,end_date}'列以防止相同'customer_ID '和'(customer_ID,customer_name)'(業務規則=不能重用以前的名稱)上的常規密鑰。爲了找到最近的名字何時生效,我們可以通過'customer_ID'進行分組,然後找到'MAX(start_date)'*然後*返回到表中找到'start_name'的'customer_name'。還有其他的方法,當然... – onedaywhen

+0

...通過'customer_ID'分組和'customer_name'不是什麼都想,因爲,因爲這隻會創建一個組,以便在這種情況下,每一行,因爲它是一個關鍵。 – onedaywhen