2016-12-20 8 views
1

私はこのようなテーブルを持っている:ハイブのレコードから2番目の最終日を取得するには?

member  dato 
    696382  2016-06-21 
    35546232 2016-02-01 
    9001107  2013-09-23 
    40310785 2014-07-18 
    3802508  2015-06-21 
    74376545 2016-01-11 
    14969202 2014-12-08 
    17495001 2015-09-01 
    17238917 2016-11-16 

ダトは、メンバーが昨日まで2015年1月1日からで、製品を購入した日付です。私は3つの列、メンバー、dato、dato_secondを含む新しいテーブルを取得したい。 dato_secondはdatoに最も近い日付です。たとえば、17238917には、 '2016-11-16'、 '2016-11-10'、 '2015-03-27'の3つのデータが追加され、新しいレコードは17238917、 '2016-11-16 '、' 2016-11-10 'だから新しいテーブルを手に入れる方法は?

+0

探しているものです –

答えて

1

これは、メンバーごとに複数のレコードを持っている何かにあなたのサンプルを変更し、要求された結果セットを追加してください

select member 
     ,dato 
     ,lag (dato) over (partition by member order by dato) as prev_dato    

from mytab 
+0

P.私の元の解決策(削除)で、私はあなたに "datoに最も近い日付"を与えました。これは、datoの前の日付**である必要はなく、dateの後にあるかもしれません。 –

+0

ありがとうございます。完璧に走りなさい。 – yanachen

1

Hmmm。私は条件付きの集約とrow_number()が最も簡単な解決策だと思う:

select member, 
     max(case when seqnum = 1 then dato end) as dato, 
     max(case when seqnum = 2 then dato end) as dato_1 
from (select t.*, 
      row_number() over (partition by member order by dato desc) as seqnum 
     from t 
    ) t 
group by member; 
+0

私は重複したメンバーですべての記録を保持したいと思います。新しい結果は、ソース表と同じ数の行を持ちます。 – yanachen

+0

顔では、私は現在のデータに与えられたすべての前回のデータを計算したいと思います。 – yanachen

関連する問題