2017-09-06 9 views
0

今週はteradata SQLを開始したばかりなので、フレーズを正しく入力しなければ申し訳ありません。私はもともとテーブル内の重複を取り除くスクリプトをRで作成しましたが、今はこのコードをSQLに移す必要があります。ここではいくつかのサンプルデータは、次のとおりです。Teradata SQL特定の順序で重複を取り除く

enter image description here

私はDELETEの列、IDによってパーティション、STATUS、日付、金額によって順序で任意のD'sのを取り除きたい(実際の日付とし、前の金額の?) 。 STATUSがこの順番になるようにします:P、H、F、U、T. STATUS、DATE、およびAMOUNTが記入された最初の行にSTATUSを順番に入れます。

enter image description here

私は本当に順序の問題に引っかかっていると私が書いたコードは、すべての任意のデータ(ただし、エラーなし)を製造されていません。ここでは例の出力データがあります。

サンプルコード:

CREATE VOLATILE TABLE new_tble 
AS 
(SELECT * 
FROM table 
QUALIFY row_number() OVER (partition BY ID ORDER BY ID, DATE, AMOUNT)=1 
WHERE DELETE <> 'D' 
) 
with data; 
+1

あなたはそれが「doesnの書いたコードは何ですか任意のデータを生成する? –

+0

@TabAlleman私は複数の失敗したスクリプトを持っています:)しかし、私はここに私の最新のスクリプトを追加します。私はそれをサンプル形式に変換するだけです。 – user108363

+1

タグ「TSQL」は、Teradataのものではなく、Microsoft SQL ServerのSQL言語を意味します。 – dnoeth

答えて

2

これは?NULLを意味と仮定し、TeradataのSQLへのあなたの説明の直接の翻訳である:

select * 
from tab 
where "delete" is null 
    and "date" is not null 
    and amount is not null 
qualify 
    row_number() 
    over (partition by id 
     order by case status 
        when 'P' then 1 
        when 'H' then 2 
        when 'F' then 3 
        when 'U' then 4 
        when 'T' then 5 
        end 
        ,"date" 
        ,amount) = 1 
+0

@dnoethThisはwhere文なしで動作します。私は、SQLがNULL値を生成しているかどうか、または単に? DATE <> '?'のように変更しようとすると、「文字列が数値に変換できませんでした」というエラーが表示されます。 – user108363

+1

@ user108363これにはIS NULLまたはIS NOT NULLを使用する必要があります。 –

+1

@ user108363:デフォルトでは、NULLは他の値よりも低く並べ替えられているため、間違った結果が得られることはありません。 – dnoeth

関連する問題