如果有1行以上具有相同的locationID,则返回行但过滤

时间:2011-11-21 21:22:16

标签: sql sql-server

表#预约:

ID, Name, LocationID, Created

目前我有:

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

问题是,有时候给定的行数超过1行 LocationID ,在这种情况下,我想返回具有最新日期的那个。

查询会是什么样的?

2 个答案:

答案 0 :(得分:7)

您没有提到您正在使用的SQL Server的版本 - 但如果您使用的是2005或更新版本,则可以使用{{1的CTE(公用表表达式)功能:

ROW_NUMBER

此CTE按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 “分区”您的数据,对于每个分区,LocationID函数会发出序号,从1开始并按ROW_NUMBER排序 - 所以最新一行得到Created DESC(对于每个RowNum = 1),这是我在后面的SELECT语句中从CTE中选择的。

答案 1 :(得分:3)

您提出的问题是不可能的。

如果您的WHERE子句指定:

WHERE Created = @today

然后根据定义,您的所有行都会包含 IDENTICAL Created字段。

您是否还想使用其他字段?