2016-10-19 3 views
1

データの行の最大を取得する方法:上記各グループ(SQLまたはSAS)

ID step order 
100 1 1 
100 2 2 
100 3 3 
100 1 4 
200 2 5 
200 3 6 
200 1 7 

望ましい結果(私は各グループの上の行の最大を取得したい)

ID step max_step 
100 1  1 
100 2  2 
100 3  3 
100 1  3 
200 2  2 
200 3  3 
200 1  3 

はどうもありがとうございました!:)

+0

どのデータベースとどのバージョンですか?質問に適切なタグを付けてください。 –

+0

ありがとう、Teradataにあります。 – Sylvia

+0

SQLで必要なことをすることはできません。 SQLテーブルは、*順序付けられていない*集合を表します。したがって、順序を決定する列がなければ、上記の行の概念はありません。 SASでは、データ・ステップに 'retain'を使用することができます。 –

答えて

0

を削除するには、行の順序のいくつかのアイデアを持っているしたい場合は、SASは、ここでは簡単に答えになるだろう。

data want; 
    set have; 
    by ID; 
    retain max_step; 
    if first.id then call missing(max_step); 
    max_step = max(step,max_step); 
run; 
+0

大変ありがとう!これはまさに私が欲しいものです!心から感謝する! – Sylvia

1

データベースが

SELECT id, 
     step, 
     Max(step) OVER(partition BY ID ORDER BY "order") as max_step 
From yourtable 
01その後、ウィンドウ集計をサポートしている場合あなたは関係なく IDの列の上から最大のステップにしたい場合は

その後、partition by

SELECT id, 
     step, 
     Max(step) OVER(ORDER BY "order") as max_step 
From yourtable 
+0

私はこれを試しました。しかし、それは各グループの最大値を得ることしかできないようです。私は各グループの上の行の最大値(現在の行を含む)を取得したい。 – Sylvia

+0

@シルビア - しかし、あなたの期待した結果ではそうではありません。 'max_step'の' ID = 2'に対しては、前のレコードに '3'があっても' 2'を返します。 –

+0

@Prdp新しいIDでリセットされます。しかし、 'id = 2'の最初の行には' 2'が必要です。 – Joe

0

あなたは累積最大必要があります:Teradataのは、あなたが(それはとにかくお勧めしますこれは)それを追加する必要がありrange unbounded precedingデフォルトは標準SQLに従っていませんので

max(step) 
over(partition by id 
    order by ordercol 
    rows unbounded preceding) 

を。 累積

のみlast_valueデフォルト:もちろん

last_value(step) 
over(partition by id 
    order by ordercol) 

あなたも、rows unbounded precedingを追加することができます。

関連する問題