SQL选择按其他内容分组时具有最高值的行

SQL选择按其他内容分组时具有最高值的行,sql,sql-server-2008,grouping,max,Sql,Sql Server 2008,Grouping,Max,我有一张这样的桌子: . | ID | SystemID | StartDateTime | EndDateTime | 1 | 24 | 1 | 2012-11-09 13:59:00.000 | 2012-11-09 14:23:00.000 | 2 | 25 | 2 | 2012-11-09 13:59:00.000 | 2012-11-09 14:23:00.000 | 3 |

我有一张这样的桌子:

 . |  ID  | SystemID |       StartDateTime       |        EndDateTime        |
1 |  24  |     1    |  2012-11-09 13:59:00.000  |  2012-11-09 14:23:00.000  |
2 |  25  |     2    |  2012-11-09 13:59:00.000  |  2012-11-09 14:23:00.000  |
3 |  26  |     3    |  2012-11-09 14:00:00.000  |  2012-11-09 14:24:00.000  |
4 |  27  |     1    |  2012-11-09 16:20:00.000  |  2012-11-09 17:19:00.000  |
5 |  28  |     2    |  2012-11-09 16:21:00.000  |  2012-11-09 17:37:00.000  |
6 |  29  |     3    |  2012-11-09 17:25:00.000  |  2012-11-09 17:50:00.000  |
|  ID  | SystemID |       StartDateTime       |        EndDateTime        |
|  27  |     1    |  2012-11-09 16:20:00.000  |  2012-11-09 17:19:00.000  |
|  25  |     2    |  2012-11-09 13:59:00.000  |  2012-11-09 14:23:00.000  |
|  26  |     3    |  2012-11-09 14:00:00.000  |  2012-11-09 14:24:00.000  |
对于每个系统id,我想选择在给定时间之前结束的最接近的行。 例如,如果时间是17:30,结果将如下所示:

 . |  ID  | SystemID |       StartDateTime       |        EndDateTime        |
1 |  24  |     1    |  2012-11-09 13:59:00.000  |  2012-11-09 14:23:00.000  |
2 |  25  |     2    |  2012-11-09 13:59:00.000  |  2012-11-09 14:23:00.000  |
3 |  26  |     3    |  2012-11-09 14:00:00.000  |  2012-11-09 14:24:00.000  |
4 |  27  |     1    |  2012-11-09 16:20:00.000  |  2012-11-09 17:19:00.000  |
5 |  28  |     2    |  2012-11-09 16:21:00.000  |  2012-11-09 17:37:00.000  |
6 |  29  |     3    |  2012-11-09 17:25:00.000  |  2012-11-09 17:50:00.000  |
|  ID  | SystemID |       StartDateTime       |        EndDateTime        |
|  27  |     1    |  2012-11-09 16:20:00.000  |  2012-11-09 17:19:00.000  |
|  25  |     2    |  2012-11-09 13:59:00.000  |  2012-11-09 14:23:00.000  |
|  26  |     3    |  2012-11-09 14:00:00.000  |  2012-11-09 14:24:00.000  |
希望这有意义!谢谢您的帮助。

您可以使用行号:

DECLARE @Date DATETIME
SET @Date = '20121109 17:30:00'

;WITH CTE AS
(
    SELECT  *, 
            ROW_NUMBER() OVER(PARTITION BY SystemID ORDER BY EndDateTime DESC) RN
    FROM YourTable
    WHERE EndDateTime < @Date
)
SELECT ID, SystemID, StartDateTime, EndDateTime
FROM CTE
WHERE RN = 1
供您尝试。

您可以使用外部应用: