2017-05-19 27 views
1

私はOracleテーブルTを持っています。そこには開始日の異なる複数のレコードがあります。私はcol1、col2、col3の同じ組み合わせの中で最も偉大な日付のものを保つために、すべてを削除したいと思います。この例では、1月31日に日付を保持し、残りの2つを削除したいと考えています。別のステージングテーブルを作成せずに単一のクエリでこれを実現するには、どうすればよいでしょうか?最も近い日付に基づいてOracleテーブルにレコードを保持する方法

テストスクリプト - それはCOL1の同じ組み合わせを持つ日付の最も大きいので、

上記のデータに基づいて
create table t 
(col1 number(10) 
,col2 number(10) 
,col3 number(10) 
,col4 number(10) 
,col5 date 
); 

insert into t values (15731,467,4087,14427,'09-Apr-17'); 
insert into t values (15731,467,4087,17828,'31-May-17'); 
insert into t values (15731,467,4087,15499,'16-Apr-17'); 
commit; 

select * from t;[enter image description here][1] 

、私は日が31月-17であるレコードのみを維持したいと思います、col2、col3を削除し、残りの2つをテーブルから削除します。上記のような他の数百万ものレコードがこの表にあることに注意してください。 これはあまりにも純粋なOracleの専門家の質問ですが、私は非常に新しいこの場所でOracleデータベースの私の手を試してみて謝罪します。

+1

複数のレコードを同じ時間間隔でどのようにつなぎますか? –

+0

これはまさに私が実現する挑戦であると気づいたことです - 時間のずれが同じであれば?簡単にするために、col1、col2、col3の同じキーを持つ古い日付を削除し、そのキーコンボの日付のうち最大のものを持つレコードを保持するという基準を変更しました。指摘ありがとう! – Brendon

+0

あなたの説明を変更して、結びつきの仕方を明確にしてください。このような事例を説明するために、喜んで例を挙げましょう。 – miracle173

答えて

0

これはoracle12cをタグ付けされているので、あなたにも、その機能を活用することがあります。例えば、MATCH_RECOGNIZEを使用して:これは想定してい

delete from t 
    where rowid not in (
         select rowid 
         from t 
         match_recognize (
          partition by col1, col2, col3 
          order by col5 desc 
          all rows per match 
          pattern (^ a x*) 
          define x as x.col5 = a.col5 
         ) 
        ) 
; 

あなたはCOL1、COL2、COL3の所定の組み合わせのために、最新の開始日については「結ば」すべての行を維持したいです。ソリューションは、要件のバリエーションに合わせて調整することができます。

+0

Thanks Mathguy ...オラクルのドキュメントからMatch_Recognize関数について読んでいて、パターンマッチング基準をどのように開発したのか興味深い....もう一度ありがとう! – Brendon

1

日付とsysdateの差の絶対値で行を並べ替えることができます。その後、クエリおよびDELETEステートメントの間で相関するrowid疑似列を使用することができます。

DELETE FROM t 
WHERE rowid NOT IN (SELECT r 
        FROM (SELECT rowid AS r, 
            ROW_NUMBNER() OVER 
             (PARTITION BY col1, col2, col3 
             ORDER BY ABS(SYSDATE - col5) ASC) AS rn 
          FROM t) 
        WHERE rn = 1) 
+0

これは 'ROW_NUMBER'の代わりに' partition by..'と 'RANK'を含んでいなければなりません。 –

+0

私は非常にはっきりしていないことをお詫びしますが、最も近い日付を見つけるのではなく、col1、col2、col3の同じ組み合わせを使用して、日付の中で最も日付の高いものを保持します。 – Brendon

+0

@vkp Brendonの最後のコメントがあったなら、あなたは正しいのですが、 'partition by'節がそこにはありません。 'row_number'対'ランク '問題について - OPが単一のレコードまたは全ての束縛されたレコードを保持したい場合に依存します – Mureinik

関連する問題