在SQL Server中使用聚合内部和外部的列

时间:2017-08-29 01:28:35

标签: sql-server

我试图计算一列的z得分,如下:

select uid, score - avg(score) / stdev(score)
from #scores
group by uid

但是,我收到以下错误。

  

Msg 8120,Level 16,State 1,Line 1
  专栏' #scriss.score'在选择列表中无效,因为它不包含在聚合函数或GROUP BY子句中。

但是在聚合函数中使用了明显的分数?此SQL语句适用于Sybase,但不适用于SQL Server。知道如何解决这个问题吗?

谢谢你们

1 个答案:

答案 0 :(得分:0)

您收到的错误消息非常清楚,我很惊讶查询在Sybase上运行。您在score聚合的上下文中自行选择uid。这没有逻辑意义,因为SQL Server 不清楚哪个 score要用于每个uid组(通常可能会有超过一个)。您拨打AVGSTDEV的电话很好。作为解决方法,我建议使用AVGSTDEV作为分析函数。这将允许访问这些聚合值,但在结果集中包含每一行,因此包括score的每个值。

SELECT
    uid,
    (score - AVG(score) OVER (PARTITION BY uid) ) /
        STDEV(score) OVER (PARTITION BY uid) score_calc
FROM #scores