2016-05-09 12 views
0

私は約800万行のテーブルを持っています。行には、ID、日付、およびイベントコードが含まれています。私は、すべてのIDとイベントコードが1に等しい日付を選択し、過去のある時点で2に等しいイベントコードが存在することを希望します。例えばSQL Server 2012複数の条件に基づいて最大日付を選択

、私のテーブルは次のようになります。

ID Date  Code 
---------------------- 
1  4/16/2016 6 
1  4/10/2016 1 
1  3/1/2016 13 
1  1/26/2016 2 
2  5/2/2016 8 
2  3/14/2016 1 
2  1/13/2016 14 

私は、ID = 1と日= 2016年4月10日を返したいが、私はID = 2ので、何がID = 2で返されたくありません

これらの結果を得るには、SELECTステートメントをどのように書きますか?

+0

私はあなたにヒントをあげる:選択し 'たい* FROM TABLE = 1 AND'コード....何か他 –

+0

が「1」より表示されます与えられたIDのための1回よりも? –

答えて

1

あなただけの各IDの最大の日付を選択したい場合:MAXGROUP BY、およびHAVINGを使用して

WITH Cte AS(
    SELECT *, 
     rn = ROW_NUMBER() OVER(PARTITION BY ID ORDER BY Date DESC) 
    FROM tbl 
    WHERE Code = 1 
) 
SELECT 
    ID, Date, Code 
FROM Cte c 
WHERE 
    rn = 1 
    AND EXISTS(
     SELECT 1 
     FROM tbl t 
     WHERE 
      t.ID = c.ID 
      AND t.Date < c.Date 
      AND t.Code = 2 
    ) 
; 

ONLINE DEMO


を:

SELECT 
    ID, Date = MAX(Date) 
FROM tbl t1 
WHERE Code = 1 
GROUP BY t1.ID 
HAVING MAX(Date) > (SELECT Date FROM tbl t2 WHERE t2.ID = t1.ID AND t2.Code = 2) 

ONLINE DEMO

1

existsを使用できます。

select * 
from t 
where code = 1 and 
     exists (select 1 from t t1 where t.id = t1.id and t.dt > t1.dt and t1.code=2) 
+0

ちょうどそこに 'AND'を突き刺す必要があります –

0
select id 
, max(date) 
from table to 
where to.code = 1 
and exists (select 1 from table ti where ti.id = to.id AND ti.code = 2) 
group by id 
0

@vkpは、最良の答えを持っています。しかし、ここではウィンドウ関数を使用してのアプローチです:

select t.id, t.code, t.dt 
from (select t.*, min(case when code = 2 then dt end) over (partition by id) as dt_2 
     from t 
     where code in (1, 2) 
    ) t 
where t.code = 1 and dt_2 < dt; 
関連する問題