2017-06-05 8 views
3

私は単純なサブセットを試みていますが、両方の条件を同時に適用するのに少し問題があります。私は、一意のIDごとに、値の列が増えた最新のレコードを選択することを検討しています。たとえば、私のデータの簡略版がここにあります。IDで最新の値の増分を選択してください

ID| Date | Value 
A 1/1/17 100 
A 1/2/17 185 
A 1/3/17 40 
A 1/4/17 100 
A 1/5/17 30 
B 1/3/17 40 
B 1/4/17 30 
B 1/5/17 65 
B 1/6/17 80 
B 1/7/17 0 
B 1/8/17 0 

私の所望の出力は、値の最後の増加は、各ID

ID| Date | Value 
A 1/4/17 100 
A 1/6/17 80 

ために開催された行であろうが誰も私が所望の出力を達成することができます方法についていくつかの洞察力を持っていますか?ありがとう。

答えて

0

2つのステップ:Teradataので

select t.* 
from (select t.*, 
      row_number() over (partition by id order by date desc) as seqnum 
     from (select t.*, 
        max(value) over (partition by id order by date rows between 1 preceding and 1 preceding) as prev_value 
      from t 
      ) t 
     where prev_value < value 
    ) t 
where seqnum = 1; 

、あなたはまた、サブクエリの1つのレベルを削除するにはqualifyを使用することができます。

+1

私はあなたがteradataで 'lag'を使うことはできません。 –

+0

私は値の列を使用するステートメントの部分に少し問題があります。多分それは遅れ機能にあることと関係があるでしょう。エラーは、 "データ型"の値が "定義済みの型名と一致しません"と表示されます。私は、ラグ()がteradataに存在しないことを述べているページをいくつか見ています。 –

+0

LAG()およびLEAD()は、現在のTeradataのリリースでは実装されていません。正しいウィンドウが定義されていれば、MAX()を使ってvkpで示されているのと同じことを達成できます。 –

0

これを試すことができます。

select id,dt,value 
from (select t1.* 
     ,max(case when t2.value<t1.value then t1.dt end) over(partition by t1.id) as max_dt 
     from (select t.*,min(dt) over(partition by id order by dt rows between 1 preceding and 1 preceding) as prev_dt 
      from t 
      ) t1 
     join t t2 on t1.prev_dt=t2.dt and t1.id=t2.id    
    ) t 
where max_dt=dt 
関連する問題