2012-11-28 17 views
0

我有一個表,看起來像這樣:SQL選擇由別的東西分組時具有最高值的行

. | 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,我想選擇結束最接近和前行給定的時間。 例如,如果時間爲17:30,結果是這樣的:

| 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 | 

希望這是有道理的!謝謝你的幫助。

回答

0

你可以使用outer apply

select * 
from (
     select distinct SystemID 
     from Table1 
     ) as ids 
outer apply 
     (
     select top 1 * 
     from Table1 t1 
     where t1.SystemID = ids.SystemID 
       and t1.EndDateTime < '2012-11-09 17:30' 
     order by 
       t1.EndDateTime desc 
     ) as last 

Live example at SQL Fiddle.

0

您可以使用ROW_NUMBER此:

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 

Here is an sqlfiddle,您可以嘗試。