2011-11-21 62 views
1

表#約會:返回行,但過濾器,如果有1+行與同locationID

ID, Name, LocationID, Created 

目前我有:

SELECT * 
FROM Appointments 
WHERE Created <= @today 
ORDER BY ID 

的問題是,有些時候有次對於給定的 LocationID多於1行,並且在這種情況下,我想返回具有最新日期的那一行。

查詢將是什麼樣子?

回答

7

你沒有提到什麼你使用SQL Server的版本 - 但如果你使用2005或更高版本,可以使用CTE(公共表表達式)與ROW_NUMBER功能:

DECLARE @today DATETIME = ......... 

;WITH LastAppt AS 
(
    SELECT 
     ID, Name, LocationID, Created, 
     ROW_NUMBER() OVER(PARTITION BY LocationID ORDER BY Created DESC) AS 'RowNum' 
    FROM dbo.Appointments 
    WHERE Created <= @today 
) 
SELECT 
    ID, Name, LocationID, Created 
FROM LastAppt 
WHERE RowNum = 1 
ORDER BY ID 

這CTE「分區」您的數據由LocationID,併爲每個分區,ROW_NUMBER功能轉手出去順序編號,從1開始,並通過Created DESC訂購 - 所以最新行都獲得RowNum = 1(每個ID),這是我選擇從它後面的SELECT語句中的CTE開始。

+1

請注意他的問題實際上不可能如上所述。有些東西正在被遺漏。 – JNK

+1

在結尾處填寫有序的'ORDER BY ID'行,它應該按照指定行事。 –

+0

@JNK:你是對的 - 但我敢打賭OP只是在錯誤地/不夠清楚地提出問題......或者讓他決定他是否在尋找 - 不然。 –

3

您正在定位的問題是不可能的。

如果您WHERE子句指定:

WHERE Created = @today

然後,通過定義所有的行會IDENTICALCreated領域。

是否有另一個領域,你想使用它?

+0

'你的權利,它應該<= @今天 – codecompleting