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 

但是...这不是我想要的,因为我想从 AVG 中排除每个 JUDGING_CRITERIA 分组的最高和最低值。那是我想不通的部分。AVG 应仅应用于 GROUPING FOR EACH JUDGING_CRITERIA 的中间值。JUMP_HEIGHT 的 HI 值和 LO 值不应包含在平均值中。DEXTERITY 的 HI 值和 LO 值不应包含在平均值中。等等。

我知道这可以通过将每个标准的 hi 和 lo 设置为 NULL 来完成。但这是一个功能,应该非常快。

我想知道是否有办法将其作为 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 回答