データベース内のテーブルのグループごとに最大の n を計算するインデックス付きビューを作成しようとしています。ビューに対して3つの異なるクエリを試しましたが、それらはすべてSQLサーバーで許可されていないようです。テーブルは単なるファイルのリストであり、それぞれに ID、ユーザー ID、および日付があり、各ユーザーの最新のファイルを見つけようとしています。
ここで2 つの提案を試しましたが、インデックス付きビューでグループ化または外部結合を行うことは許可されていないというエラーが表示されました。ご覧いただけるように、ここに私の実装をコピーします。
select f1.id, f1.userid, f1.filedate
from files f1
inner join(
select userid, max(filedate) as maxDate
from files
group by userid
) as f2
on f1.userid = f2.userid and f1.maxdate = f2.maxdate
また
select f1.id, f1.userid, f1.filedate
from files f1
left outer join files f2
on (f1.userid = f2.userid and f1.filedate < f2.filedate)
where f2.id is null;
これらのクエリは両方とも機能しましたが、グループ化と外部結合が許可されていないため、ビューでのインデックスの作成は失敗しました。
私も試しました
SELECT f1.id, f1.userid, f1.filedate FROM [dbo].[DiagnosticFiles] as f1
WHERE NOT EXISTS (
SELECT f1.id FROM [dbo].[DiagnosticFiles] as f2 INNER JOIN [dbo].[DiagnosticFiles] as f3 ON f2.userid = f3.userid
WHERE f1.id = f2.id AND f2.FileDate < f3.FileDate)
インデックスに追加しようとしたときに、サブクエリは許可されていないと言われました
内部結合のみでこれを行う方法については考えがありますが、問題は n-1 個の結合が必要であるように思われることです。ここで、n は単一のユーザー ID が持つファイルの最大数です。ここに基本的なクエリがあります
SELECT DISTINCT f1.id, f1.userid, f1.filedate
FROM FILES f1
INNER JOIN files f2
ON (f1.userid = f2.userid and f1.filedate > f2.filedate)
これは、特定のユーザー ID に対して最大で 2 つの行がある場合にのみ機能します。ここを参照してください。これをクエリの最後に追加した場合
INNER JOIN files f3
ON (f2.userid = f3.userid and f2.filedate > f3.filedate)
その後、ユーザーごとに最大 3 つのファイルが機能しますが、問題が発生します。
この種のクエリのインデックス付きビューを作成する合理的な方法はありますか?
ありがとう。
EDIT:さらに、インデックス付きビューを実行する方法がなく、基本的に毎回クエリを実行するインデックスなしビューのままにした場合、膨大な数の行に対して非常に遅くなり、おそらく数百の何かになりますユーザーごとの行?userid と filedate にいくつかの非クラスター化インデックスを作成することを計画していました