我正在使用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;
我正在使用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;
大約有七種方式在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
);
這沒有意義。你不能顯示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;
但通常要分組雙方,如果你想同時顯示。 (即使你說你不想)。
這對我來說很有意義,我會試着解釋如何:)考慮一個客戶姓名的'歷史'表,其中帶有序列鍵的'{customer_ID,customer_name,start_date,end_date}'列以防止相同'customer_ID '和'(customer_ID,customer_name)'(業務規則=不能重用以前的名稱)上的常規密鑰。爲了找到最近的名字何時生效,我們可以通過'customer_ID'進行分組,然後找到'MAX(start_date)'*然後*返回到表中找到'start_name'的'customer_name'。還有其他的方法,當然... – onedaywhen
...通過'customer_ID'分組和'customer_name'不是什麼都想,因爲,因爲這隻會創建一個組,以便在這種情況下,每一行,因爲它是一個關鍵。 – onedaywhen
非常感謝。這是一個很好的幫助:)它解決了我的問題。 – Sunshine