2012-01-20 9 views
1

私のアプリケーション用のOracleバックエンドがあります。このスキーマは、ユーザートランザクションを毎月12個のトランザクションテーブルに分割するように設計されています。今私は、特定の日付範囲内で最も多数の異なる文書にアクセスした上位10人のユーザーを検索したいと考えています。
私は現在、各ユーザのドキュメント上でcountDistinctを実行し、このカウントの降順でソートし、これからトップ10の結果を選択するクエリを持っています。
このクエリを各テーブルで実行し、すべての結果がリストに追加されます。私はこのリストをスキャンし、毎月のカウントで合計を行い、user_idでグループ化して、12ヶ月間にわたって各ユーザーのドキュメント合計を取得する必要があります。
同じユーザーが別の月にアクセスした同じドキュメントが存在する可能性があるため、このカウントは正しいカウントではないことに気付きました。私の現在の論理では、これらのカウントは加算されます。
複数のテーブルから上位10個の異なる値を持つ問題

結果が最も正確になるように私はどの戦略を使うべきかを知る必要があります。一つのテーブルからクエリを行う方法はわかりますが、これは正解ですが、すべての12のテーブルを照会していますか?ここ

は、あなたはすべての12個のテーブル間でunion allを行うビューを、作ることができる1月

各月の
class TxnSummJan { 
    Long id 
    Transaction trans 
    Users grauser 
    Resources graresource 
    Integer transactioncount 
    Date lastaccesseddate 
    Date currentdate 
    String accountid 
    String userlocation 

    String documentname 

    String eventdesc 
    } 

同様のテーブル..

答えて

2

もう一度。
12個のテーブルすべてにUNION ALLを適用して、それをビューにすることはできますか?

SELECT 
    documentname, 
    user, 
    accesscount 
    --and other columns 
FROM 
(
    SELECT 
     documentname, 
     user, 
     accesscount 
     --and other columns 
    FROM 
     txn_jan 

    UNION ALL 

    SELECT 
     documentname, 
     user, 
     accesscount 
     --and other columns 
    FROM 
     txn_feb 

    --and other monthly summary tables 

) yearly_summary 
+0

OPが正しく理解されていれば、異なるテーブルはトランザクションの集合の互いに素なサブセットを表しているので、重複はありません。したがって、UNIONの代わりにUNION ALLを使用すると、データベースが重複のチェックに時間を費やすことはありません。 –

+0

このように、12テーブルの「日付と日付の間でグループ名の異なる文書名を選択」し、ビューを作成してから、ユーザーごとに(文書名)を再度カウントします。 –

+0

@pri_dev上記のようなビューを作成してから、 'select distinct document ... 'を実行する必要があります。 @デイヴィッド・ウォレスは同意する、パフォーマンスの問題はここで懸念されています。 – cctan

1

のサンプル毎月のテーブルです。次に、ビューから選択します。

関連する問題