0

次のようなテーブルがあります。

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

これが理にかなっていることを願っています!ご協力いただきありがとうございます。

4

2 に答える 2

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

SQL Fiddle での実例。

于 2012-11-28T17:43:21.130 に答える
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

これはあなたが試すためのsqlfiddleです。

于 2012-11-28T17:39:27.903 に答える