2014-12-27 102 views
1

我已經搜索到但未找到我的問題的答案。從表格中檢索最近的N條記錄

我有一個由

  • ID(主鍵自動編號)
  • CLIENT_ID的訂單表:確定每個客戶端(唯一的)
  • 日期:爲每個客戶端
訂單日期

我想在單個視圖中檢索每個客戶的最後N個訂單日期

cour我可以使用SELECT TOP N date FROM orders WHERE client = 'xx' ORDER DESC,然後使用UNION作爲客戶端的不同值。問題在於,隨着客戶羣的變化,該聲明將需要修訂,並且對於龐大的客戶羣而言,UNION聲明不切實際。

作爲一個額外的需求,這需要在Access SQL中工作。

回答

1

步驟1:創建一個查詢,該查詢按每個客戶端的每個客戶端的排序順序產生

如果你已經做了第1步正確,你的結果應該是:由於訪問SQL沒有ROW_NUMBER() OVER (...)如SQL Server,你可以使用下面的問題中描述的技術模擬這個如下:

id client_id date  rank 
---------------------------------- 
     1  2014-12-01 7 
     1  2014-12-02 6 
     1  2014-12-05 5 
     1  2014-12-07 4 
     1  2014-12-11 3 
     1  2014-12-14 2 
     1  2014-12-15 1 
     2  2014-12-01 2 
     2  2014-12-02 1 
     ... 

步驟2:將來自步驟1使用該結果作爲子查詢和過濾的結果,使得只記錄與返回。

+0

投票,因爲我會建議同樣的事 – 2014-12-27 19:16:27

1

我認爲有以下將在MS Access工作:

select t.* 
from table as t 
where t.date in (select top N t2.date 
       from table as t2 
       where t2.client_id = t.client_id 
       order by t2.date desc 
       ); 

一個與MS訪問的問題是,top N將獲取超過N記錄,如果有關係。如果你想要「N」,那麼你可以在子查詢中使用order by date, id

+0

好主意,但我認爲你需要做的'ID',而不是'日期'的WHERE比較。考慮三個客戶在2014-12-01訂購的情況,但它只有兩個「相關」(即,在最後五個訂單內)。您的查詢將返回所有三條記錄。 – Heinzi 2014-12-27 16:49:59

+0

@海因子。 。 。我不明白你的評論。我認爲OP很清楚「每個客戶的最後N個訂單日期」。當然,如果OP在「最後N個訂單日期」的定義中表示「id」而不是「date」,那麼他/她當然可以使用該字段。至於客戶的數量,這是通過'top'與'order by'的交互處理的。 – 2014-12-27 16:54:44

+0

啊,我明白了。當然,你是對的:我認爲他希望「每個客戶端的最後N個訂單日期*」,即每個client_id最多有N個條目的表「client_id,date」。當然,他給出的UNION示例將導致「所有日期都在* any * client的最後5個訂單日期之內」。你的SQL完美地解決了這個問題。我仍然相信他可能實際上需要第一個解釋(這會更有意義)。 – Heinzi 2014-12-27 16:58:52