2013-06-28 13 views
1

我想預訂的數據庫表(BOOKING_IDSQL服務器 - 選擇的情況下的列條目時查詢

找出第一提供商(PROVIDER_ID)客戶端(CLIENT_ID)我目前SELECT首先是CLIENT_ID,然後計算其他各種東西。 (CLIENT_ID),計數是正確的。

我正在尋找的是

SELECT case when(min(BOOKING_ID)) then PROVIDER_ID else null end) 

但我無法內SELECT/CASE WHEN

我希望這是有道理的,問題是清楚的方式進行子查詢。

理想情況下,我想一個解決方案,是在一個單一的SELECT

回答

1

假設你想要得到的MIN(BOOKING_ID)的PROVIDER_ID通過CLIENT_ID分組下面應該工作:

SELECT 
    Client_ID, 
    Booking_ID, 
    Provider_ID 
FROM (
    SELECT 
     Client_ID, 
     Provider_ID, 
     Booking_ID, 
     ROW_NUMBER() OVER (PARTITION BY Client_ID ORDER BY Booking_ID) as RowNumber 
    FROM 
     Bookings 
    ) OrderedTable 
WHERE 
    OrderedTable.RowNumber = 1 

如何這行得通? ROW_NUMBER OVER (ORDER BY field)爲您提供行號,如果結果集是由特定字段排序的。該PARTITION BY field允許你通過一個特定的鍵分區表(在這種情況下CLIENT_ID)將重置ROW_NUMBER每個CLIENT_ID(所以如果ROWNUMBER = 1,它是爲特定客戶端的第一個條目)

更多細節在這裏: http://msdn.microsoft.com/en-us/library/ms186734.aspx

使用語法:

WITH OrderedTable AS 
(
    SELECT 
     Client_ID, 
     Provider_ID, 
     Booking_ID, 
     ROW_NUMBER() OVER (PARTITION BY Client_ID ORDER BY Booking_ID) as RowNumber 
    FROM 
     Bookings 
) 
SELECT 
    Client_ID, 
    Provider_ID, 
    Booking_ID 
FROM 
    OrderedTable 
WHERE 
    RowNumber = 1 
+0

嗨肖恩,這是夢幻般的。我很高興。對於有同樣問題的其他人,我會在第二個選擇中使用名稱標題(在我的情況b中)發生錯誤 - 這會導致錯誤 - 也要感謝鏈接 - 將來證明在將來非常有用 – finngeraghty

+0

很高興我可以幫助:) –