1

私はかなり経験豊富な SQL Server 開発者ですが、この問題には本当に困惑しています。

私には機能があります。関数は、このようなテーブルを参照しています...

PERFORMANCE_ID, JUDGE_ID, JUDGING_CRITERIA, SCORE  
--------------------------------------------------  
101, 1, 'JUMP_HEIGHT', 8   
101, 1, 'DEXTERITY', 7  
101, 1, 'SYNCHRONIZATION', 6  
101, 1, 'SPEED', 9  
101, 2, 'JUMP_HEIGHT', 6   
101, 2, 'DEXTERITY', 5  
101, 2, 'SYNCHRONIZATION', 8  
101, 2, 'SPEED', 9  
101, 3, 'JUMP_HEIGHT', 9   
101, 3, 'DEXTERITY', 6  
101, 3, 'SYNCHRONIZATION', 7  
101, 3, 'SPEED', 8  
101, 4, 'JUMP_HEIGHT', 7   
101, 4, 'DEXTERITY', 6  
101, 4, 'SYNCHRONIZATION', 5  
101, 4, 'SPEED', 8  

この例では、4 人の審査員 (ID 1、2、3、および 4) が、4 つの異なる基準 (JUMP_HEIGHT、DEXTERITY、SYNCHRONIZATION、SPEED) に対してパフォーマンス (101) を審査しています。
(私の実際のデータでは、10 以上の基準と少なくとも 6 人の審査員がいることに注意してください。)

JUDGING_CRITERIA ごとに結果をスコアに集計し、それらを合計して最終スコアに集計したい...次のような...

SELECT SUM (Avgs) FROM
(SELECT AVG(SCORE) Avgs 
  FROM PERFORMANCE_SCORES
  WHERE PERFORMANCE_ID=101
  GROUP BY JUDGING_CRITERIA) result 

しかし...それは、各JUDGING_CRITERIAグループの最高値と最低値をAVGから除外したいという点で、私が望んでいるものではありません。それは私が理解できない部分です。AVG は、GROUPING FOR EACH JUDGING_CRITERIA の MIDDLE 値にのみ適用する必要があります。JUMP_HEIGHT の HI 値と LO 値は平均に含めないでください。DEXTERITY の HI 値と LO 値は平均に含めないでください。等。

これは、カーソルを使用して各基準の hi と lo を NULL に設定することで実現できることを知っています。しかし、これは FUNCTION であり、非常に高速である必要があります。

これを SET 操作として実行する方法があるかどうか疑問に思っていますが、それでも集約から HI と LO を自動的に除外しますか?

ご協力いただきありがとうございます。おそらく高度なSQL構文で実行できると思いますが、わかりません。

最後に一つだけ。この例は、実際に私が解決しようとしている問題を単純化したものです。簡単にするために、ここでは言及していない他の制約があります。

セス

4

1 に答える 1

2

編集: -WHERE 句を CTE 内に移動しました。- パーティションから JudgeID を削除

これが私のアプローチになります

;WITH Agg1 AS 
(
    SELECT   PERFORMANCE_ID
            ,JUDGE_ID
            ,JUDGING_CRITERIA
            ,SCORE
            ,MinFind    = ROW_NUMBER() OVER (   PARTITION BY     PERFORMANCE_ID
                                                                ,JUDGING_CRITERIA
                                                ORDER BY SCORE ASC  )
            ,MaxFind    = ROW_NUMBER() OVER (   PARTITION BY     PERFORMANCE_ID
                                                                ,JUDGING_CRITERIA
                                                ORDER BY SCORE DESC )
    FROM PERFORMANCE_SCORES
    WHERE PERFORMANCE_ID=101
)
SELECT AVG(Score)
FROM Agg1
WHERE MinFind > 1
AND MaxFind > 1
GROUP BY JUDGING_CRITERIA
于 2013-01-04T05:14:32.393 に答える