2017-09-28 1 views
2

の値に基づいて1列でフィルタリングは、このようになりますこと、のTestTable、私はテーブルがあるとします。

|-------------------|------------------|------------------| 
|  Id   | EventDate  |  EventCode | 
|-------------------|------------------|------------------| 
|   1   | 2017-04-10 |  42  | 
|-------------------|------------------|------------------| 
|   2   | 2017-10-32 |  50  | 
|-------------------|------------------|------------------| 
|   3   | 2017-06-15 |  60  | 
|-------------------|------------------|------------------| 
|   4   | 2017-07-13 |  10  | 
|-------------------|------------------|------------------| 

私はEVENTCODE 60よりも後の日付で行われたイベントのみを選択します。もちろん、私は一時的な変数を作成し、WHERE句を使用できます。

DECLARE @TestEventDate DATETIME; 
SET @TestEventDate = 
    (SELECT TOP 1 EventDate 
    FROM TestTable 
    WHERE EventCode = 60); 
SELECT * 
FROM TestTable 
WHERE EventDate > @TestEventDate 

をしかし、私は助けるが、複数のSELECT文を実行せずにこれを行う方法である必要があり、ここで考えることはできません。同じSELECT内で間接的にフィルタをかけて、一時変数を設定せずにwhere句のEventCodeにEventDateをマッピングすることはできますか?

あなたは自分のSSMSでまっすぐにそれを実行できるように、ここで一時テーブルに上記のセットがあります:

DECLARE @TestTable TABLE(Id INT, EventDate DATETIME, EventCode INT); 
INSERT INTO @TestTable(Id, EventDate, EventCode) VALUES (1, '20170410', 42); 
INSERT INTO @TestTable(Id, EventDate, EventCode) VALUES (2, '20171030', 50); 
INSERT INTO @TestTable(Id, EventDate, EventCode) VALUES (3, '20170615', 60); 
INSERT INTO @TestTable(Id, EventDate, EventCode) VALUES (4, '20170713', 10); 

DECLARE @TestEventDate DATETIME; 
SET @TestEventDate = 
    (SELECT TOP 1 EventDate 
    FROM @TestTable 
    WHERE EventCode = 60); 
SELECT * 
FROM @TestTable 
WHERE EventDate > @TestEventDate 

答えて

0

一つの方法は、サブクエリです:

SELECT * 
FROM TestTable 
WHERE EventDate > (SELECT TOP 1 EventDate FROM TestTable WHERE EventCode = 60); 

ます。また、ウィンドウ関数を使用することができます:EVENTCODEはユニーク

select tt.* 
from (select tt.*, 
      max(case when eventcode = 60 then eventdate end) over() as eventdate_60 
     from testtable tt 
    ) tt 
where eventdate > eventdate_60; 
+0

インデックスが良い230億行の場合はどうなりますか? @clementakis。 – clementakis

+0

。 。新しい質問は質問ではなく、コメントでお願いします。 –

2

ある場合では、次の操作を行うことができます。

SELECT T2.* 
FROM TestTable AS T 
INNER JOIN TestTable AS T2 ON (T.eventdate > T2.eventdate) 
WHERE T.EventCode = 60 
1

ジョインですべてを行うことができます。基本的には、このようなレコードに説明に合ったすべてのレコードを結合したいと考えています。

DECLARE @TestTable TABLE(Id INT, EventDate DATETIME, EventCode INT); 

INSERT INTO @TestTable 
    (Id, EventDate, EventCode) 
VALUES 
    (1, '20170410',  42), 
    (2, '20171030',  50), 
    (3, '20170615',  60), 
    (4, '20170713',  10); 

SELECT 
    T1.* 
FROM 
    @TestTable T1 
    JOIN @TestTable T2 
     ON T1.EventDate > T2.EventDate 
     AND T2.EventCode = 60