INDICATORS
パフォーマンス指標の詳細と現在のスコアを格納するテーブルがあります。IND_HISTORIES
インジケーター スコアの履歴値を格納する別のテーブルがあります。データは設定された期間 (四半期ごと) から まで保存されINDICATORS
、IND_HISTORIES
スコア/評価の傾向が確立されます。
IND_HISTORIES
これに似た列構造を持っています-
pk_IndHistId fk_IndId Score DateSaved
評価レベルも定義されています。つまり、スコア値 1 ~ 3 は低、4 ~ 6 は平均、7 ~ 9 は高です。
アラート機能を構築しようとしています。これにより、最新の評価レベル ( の最新のスコアに基づくIND_HISTORIES
) が 2 番目に新しい評価レベル ( の 2 番目に新しいスコアに基づく) よりも大きい場合にレコードが返されIND_HISTORIES
ます。
以下のようなコードを使用して、スコア値を評価レベルのしきい値に変換する一時テーブルを作成しています...
-- opt_IND_ScoreValues = 1;2;3;4;5;6;7;8;9
DECLARE @tblScores TABLE (idx int identity, val int not null)
INSERT INTO @tblScores (val) SELECT IntValue FROM dbo.fn_getSettingList('opt_IND_ScoreValues')
-- opt_IND_RatingLevels = Low;Low;Low;Avg;Avg;Avg;High;High;High
DECLARE @tblRatings TABLE (idx int identity, txt nvarchar(128))
INSERT INTO @tblRatings (txt) SELECT TxtValue FROM dbo.fn_getSettingList('opt_IND_RatingLevels')
-- combine two tables above using a common index
DECLARE @tblRatingScores TABLE (val int, txt nvarchar(128))
INSERT INTO @tblRatingScores SELECT s.val, r.txt FROM @tblScores s JOIN @tblRatings r ON s.idx = r.idx
-- reduce table rows above to find score thresholds for each rating level
DECLARE @tblRatingBands TABLE (idx int identity, score int not null, rating nvarchar(128))
INSERT INTO @tblRatingBands
SELECT rs.val, rs.txt FROM @tblRatingScores rs
INNER JOIN (SELECT MIN(val) as val FROM @tblRatingScores GROUP BY txt) AS x ON rs.txt = x.txt AND rs.val = x.val
ORDER BY val
質問:IND_HISTORIES
の最新の評価レベルが 2 番目に新しい評価レベルよりも高いレコードを返す、テーブルに対して実行できる洗練されたクエリはありINDICATOR
ますか?
更新:明確にするためINDICATORS
に、計算では使用されません。これは、パフォーマンス測定の一般情報と現在の「揮発性」スコアを保持する親テーブルです。スコアはIND_HISTORY
定期的に保存されます。これにより、データの特定時点の「スナップショット」が提供され、スコアの傾向を確立するのに役立ちます。
IND_HISTORY
インジケーターの最新の「スナップショット」値が 2 番目に新しい「スナップショット」値よりも高い場所を見つけるために、テーブルをクエリしようとしています。(スコアの増加が評価レベルの増加をもたらす場合にのみ行が返されるように、上記のように、評価レベル テーブルも結合することが理想的です。)
すべてのソリューションは、SQL Server 2005 と互換性がある必要があります。