2

これは私が持っているクエリのより単純なバージョンです。

Alias1 as 
(select distinct ID, file_tag, status, creation_date from tables where creation_dt >= sysdate and creation_dt <= sysdate + 1),

Alias2 as 
(select distinct ID, file_tag, status, creation_date from same tables creation_dt >= sysdate and creation_dt <= sysdate + 1)

select distinct Alias1.ID ID_1,
           Alias2.ID ID_2,
           Alias1.file_tag,
           Alias1.creation_date in_dt1,
           Alias2.creation_date in_dt2
    from   Alias1, Alias2
    where Alias1.file_tag = Alias2.file_tag
          and Alias1.ID != Alias2.ID
    order by Alias1.creation_dt desc

これは結果の例です。これらは両方とも同じですが、値が反転しています。

    ID_1 ID_2  File_Tag     in_dt1          in_dt2
    70   66    Apples       6/25/2012 3:06  6/25/2012 2:53:47 PM
    66   70    Apples       6/25/2012 2:53  6/25/2012 3:06:18 PM

クエリの目的は、一致するファイルタグを持つ複数のIDを検索し、その日の早い時間に送信されたIDに対して処理を実行することです(クエリは毎日実行され、その特定の日からの複製のみが必要です)。私はまだSQL/Oracleに比較的慣れていないので、この問題に取り組むためのより良い方法があるかどうか疑問に思います。

4

2 に答える 2

3
SELECT *
  FROM (SELECT id, file_tag, creation_date in_dt
             , row_number() OVER (PARTITION BY file_tag 
                                      ORDER BY creation_date) rn
             , count(*) OVER (PARTITION BY file_tag) ct
          FROM tables
         WHERE creation_date >= TRUNC(SYSDATE)) tbls
 WHERE rn = 1
   AND ct > 1;

これにより、今日少なくとも2つのレコードを持つ各file_tag内の最初の(最も早い)行が取得されます。

内部選択は、作成日ごとに同一のfile_tagレコードの各セットの相対的な行番号を計算します。外側の選択は、各パーティションの最初のものを取得します。

これは、目標ステートメントから、各file_tagの最初の1行で何かを実行したいことを前提としています。内部クエリは、当日のいつかのcreation_dateを持つ行のみを返します。

于 2012-06-25T20:22:05.533 に答える
1

比較操作を変更するだけの簡単な方法は次のとおりです。

select distinct Alias1.ID ID_1, Alias2.ID ID_2, Alias1.file_tag,
       Alias1.creation_date in_dt1, Alias2.creation_date in_dt2
from Alias1 join
     Alias2
     on Alias1.file_tag = Alias2.file_tag and
        Alias1.ID < Alias2.ID
order by Alias1.creation_dt desc 

等しくないものを2つのアイデアを注文未満に置き換えると、常に小さい方が最初になります。これにより、重複がなくなります。注:結合構文も修正しました。

于 2012-06-25T22:00:40.337 に答える