0

INDICATORSパフォーマンス指標の詳細と現在のスコアを格納するテーブルがあります。IND_HISTORIESインジケーター スコアの履歴値を格納する別のテーブルがあります。データは設定された期間 (四半期ごと) から まで保存されINDICATORSIND_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 と互換性がある必要があります。

4

1 に答える 1

0

以下を実装しましたが、うまくいくようです。しかし、最適化または統合するための推奨事項を聞きたいです。

まず、上記で作成した最後の一時テーブルは必要ないことに気付きました@tblRatingBands。代わりに、@tblRatingScores以下の最初のクエリ セットから一致するテキスト レーティングを選択するだけです。

次に、最後のクエリで、スコア値が増加したかどうか、および評価テキストが変更されたかどうかを確認します。これは、トレンド スコアが増加し、評価レベルが変化したことを示しています。

DECLARE @tblTrendScores TABLE (indId int not null, ih_date datetime, rowNo int, ih_score int, rating nvarchar(128));

WITH LastTwoScores AS (
  SELECT fk_IndId,
         DateSaved,
         ROW_NUMBER() OVER (PARTITION BY fk_IndId ORDER BY DateSaved DESC) AS RowNo,
         Score
  FROM Ind_History
)
INSERT INTO @tblTrendScores
SELECT *,
       (SELECT txt FROM @tblRatingScores WHERE val = Score)
FROM LastTwoScores
WHERE RowNo BETWEEN 1 AND 2
ORDER BY fk_IndId, RowNo

SELECT a.indId,
       a.ih_date,
       CASE  WHEN ((a.ih_score > IsNull(b.ih_score, 0)) AND (a.rating <> IsNull(b.rating, 'none'))) THEN 'Up'
             WHEN ((a.ih_score < IsNull(b.ih_score, 0)) AND (a.rating <> IsNull(b.rating, 'none'))) THEN 'Down'
             ELSE 'no-change'
       END AS TrendRatingChange
FROM @tblTrendScores a
  JOIN @tblTrendScores b ON a.indId = b.indId AND b.rowNo = 2
WHERE a.rowNo = 1
于 2013-04-15T05:51:27.253 に答える