私のアプリケーション用の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
}
同様のテーブル..
OPが正しく理解されていれば、異なるテーブルはトランザクションの集合の互いに素なサブセットを表しているので、重複はありません。したがって、UNIONの代わりにUNION ALLを使用すると、データベースが重複のチェックに時間を費やすことはありません。 –
このように、12テーブルの「日付と日付の間でグループ名の異なる文書名を選択」し、ビューを作成してから、ユーザーごとに(文書名)を再度カウントします。 –
@pri_dev上記のようなビューを作成してから、 'select distinct document ... 'を実行する必要があります。 @デイヴィッド・ウォレスは同意する、パフォーマンスの問題はここで懸念されています。 – cctan