2011-11-21 30 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