2013-08-30 30 views
1

我有一個顯示一個客戶的第二個結果的查詢。我現在需要做的是在特定列表中顯示每個客戶的第二個結果(例如20個不同的客戶G/1931,G/1932,G/1933等)。顯示多個記錄的第二個結果

我該怎麼做?通過SSMS 2005的SQL Server 2000

1個客戶

當前的查詢是

SELECT TOP 1 link_to_client, call_ref 
FROM 
(
    SELECT TOP 2 link_to_client, call_ref 
    FROM calls WITH (NOLOCK) 
    WHERE link_to_client IN ('G/1931') 
     AND call_type = 'PM' 
    ORDER BY call_ref DESC 
) x 
ORDER BY call_ref 
+0

是'call_ref'唯一的或者可能是重複的?如果一個'link_to_client'對於前2個'call_refs'具有相同的值,那麼你是否需要其中的一個作爲結果或下一個值? –

+4

一個[小提琴](http://sqlfiddle.com/#!3)與一些數據將有所幫助... – Kaf

+0

call_ref是唯一的 – chenks

回答

2

我認爲最有效的方法是排除最小​​每個link_to_client,然後採取的是的最少:

SELECT calls.link_to_client, 
     MAX(calls.Call_Ref) call_ref 
FROM calls WITH (NOLOCK) 
     LEFT JOIN 
     ( SELECT link_to_client, MAX(Call_Ref) call_ref 
      FROM calls WITH (NOLOCK) 
      WHERE calls.call_type = 'PM' 
      GROUP BY link_to_client 
     ) MaxCalls 
      ON MaxCalls.link_to_client = calls.link_to_client 
      AND MaxCalls.Call_ref = calls.call_ref 
WHERE calls.call_type = 'PM' 
AND  MaxCalls.link_to_Client IS NULL 
GROUP BY calls.link_to_Client; 

但是,如果您想擴大這個範圍,例如每個客戶的第五名,那麼它就會變得混亂。在這種情況下,我會用:

SELECT calls.link_to_client, calls.call_ref 
FROM calls 
WHERE 5 = ( SELECT COUNT(*) 
       FROM calls c2 
       WHERE c2.link_to_Client = calls.link_to_Client 
       AND  c2.call_ref <= calls.call_ref 
      ); 

我的建議的最後一塊將升級到SQL-Server的一個新版本,在那裏你可以使用ROW_NUMBER

Examples on SQL Fiddle

感謝Nenad Zivkovic爲小提琴

+0

好給了第一個選擇一個嘗試,但它沒有給我的結果期待着我測試過的3個客戶。 我有第四個結果,而不是第二個。 – chenks

+0

實際上,剛剛重讀了你所說的話,我想我們想排除每個link_to_client的MAXIMUM call_ref,然後取最大值 – chenks

+0

我編輯了答案來反映這一點。我錯過了您的訂單上的'DESC'。抱歉。 – GarethD