2016-12-21 1 views
0

と窓関数を用いて、MIN日を選択:好ましくは、(ウィンドウがない場合にも働くことができることにより、サブクエリグループ)ウィンドウ関数を使用して表TTのための追加の行条件

+----+------+-----------+------+ 
| ID | Name | SDate | Code | 
+----+------+-----------+------+ 
| 1 | Ash | 4/12/2016 | A | 
| 1 | Ash | 4/19/2016 | A | 
| 1 | Ash | 2/14/2016 | B | 
| 1 | Ash | 1/1/2016 | A | 
| 2 | Brat | 9/21/2016 | A | 
| 2 | Brat | 8/7/2016 | A | 
| 2 | Brat | 8/19/2016 | B | 
| 2 | Brat | 11/21/2016| B | 
+----+------+-----------+------+ 

をIが必要それはだように、各IDグループによってCode= A最も早いSDateを抽出する早いSDateCode=Bさん早いSDate後。これまでにない。だから、所望の出力

+----+------+-----------+ 
| ID | Name | SDate | 
+----+------+-----------+ 
| 1 | Ash | 4/12/2016 | 
| 2 | Brat | 8/7/2016 | 
+----+------+-----------+ 

コードの試み:

SELECT DISTINCT 
    TT.ID AS ID 
    ,TT.Name AS Name 
    ,MIN(CASE WHEN TT.Code='A' THEN TT.SDate END) OVER (PARTITION BY TT.ID) AS SDate 

FROM TT 
ORDER BY TT.ID 

これは私に、各個別のIDについてCode=A最も早いSDateを与え、ない早い早い後Code=B

+1

idには複数のコード= Bがありますか? –

+1

コード** B **については何がわかっていますか?名前ごとに常に1つのオカレンスですか? –

+0

はい。いい視点ね。だから最古のコード= Bの後の最古のコード= A。質問が更新されました。 – AS91

答えて

3

が最小のBを取得します。各IDの日付を取得し、その日付以降の最小A日付を取得します。

期待される結果は、Bratに対して '9/21/2016'となるはずです。

select id,name,min(sdate) from (
select id,name,code,SDate 
,min(case when code='B' then sdate end) over(partition by id) as min_b_dt 
from tt) x 
where code = 'A' and sdate >=min_b_dt 
group by id,name 
+0

8/7/16は9/21/16より早くなります – AS91

+0

@ AS91 * Code = Bの最も古いSDateの後の最も早いSDateとなるように、各IDグループによってCode = Aの最も早いSDateを抽出する必要があります。これまでになかったことです。*これが質問の内容です –

+0

私の言葉が混乱していたら申し訳ありません。私が尋ねることは、Bratの場合、CodeB SDateの初期バージョンは8/19/16で、CodeA SDateの最初の8/19/16は8/7/16となります。従って8/7/16。 Ashleyの場合、CodeB SDateは1つしかないので、自然に4/12/16が出力の最も早いCodeA SDateになります。 – AS91

関連する問題