2016-08-09 2 views
2

これは説明がやや難しいです...(これはTeradataにSQL Assistantを使用しています。 。SQL:最大値をとりますが、特定のIDのフィールドが見つからない場合は、すべての値を無視してください。

ID   creation_date  completion_date  Difference 
123   5/9/2016    5/16/2016    7 
123   5/14/2016   5/16/2016    2 
456   4/26/2016   4/30/2016    4 
456   (null)    4/30/2016    (null) 
789   3/25/2016   3/31/2016    6 
789   3/1/2016    3/31/2016    30 

IDには複数のcreation_dateが含まれることがありますが、常に同じcompletion_dateを持ちます。 IDのすべてのレコードに対してcreation_dateが設定されている場合は、最新のcreation_dateのレコードを返したいと思います。ただし、指定されたIDのANY creation_dateがない場合、このIDに関連付けられたすべてのレコードを無視します。

上記のデータを考えると、私は返すようにしたいでしょう:第二のレコードが不足しているCREATION_DATEを持っているので

ID   creation_date  completion_date  Difference 
123   5/14/2016   5/16/2016    2 
789   3/25/2016   3/31/2016    6 

ませレコードが456のために返されません。最新のcreation_dateのレコードが123と789に返されます。

ご協力いただければ幸いです。ありがとう!

+1

あなたの質問を編集して、データベースにタグを付けてください... – sgeddes

+1

'HAVING COUNT(CREATION_DATE):ここで


conditional aggregationを使用して、より一般的なバージョンです。 COUNT(*) ' –

+0

「差分」を保存する必要がありますか? Teradataでは、 "date1" - "date2"のように日付の差を計算することができると信じています。 – pilcrow

答えて

1

データベースによっては、row_numberを使用してグループあたりの日付をmaxにする1つのオプションがあります。その後、null値に対してチェックするnot existsでそれらの結果をフィルタリングすることができます。

select * 
from (
    select *, 
     row_number() over (partition by id order by creation_date desc) rn 
    from yourtable 
) t 
where rn = 1 and not exists (
    select 1 
    from yourtable t2 
    where t2.creationdate is null and t.id = t2.id 
) 

row_numberは、多くのデータベースでサポートされてwindow functionです。 mysqlは、user-defined variablesを使用して同じ結果を得ることはできません。 =

select t.* 
from yourtable t 
    join (select id, max(creation_date) max_creation_date 
      from yourtable 
      group by id 
      having count(case when creation_date is null then 1 end) = 0 
    ) t2 on t.id = t2.id and t.creation_date = t2.max_creation_date 
+0

ありがとう!私は後者のクエリを動作させることができました。それは意図したとおりに動作するようです! – chr

関連する問題