最初のものは私にとっては機能しません(メッセージ8120列「Salaries.employeeID」を返すことは、集計関数またはGROUP BY句のいずれにも含まれていないため、選択リストでは無効です)、追加するまでgroup by employeeID
:
SELECT
employeeID as ID,
RANK() OVER (ORDER BY AVG (Salary) DESC) AS Value
FROM Salaries
GROUP BY employeeID
おそらく、理解を深めるために、次のように同等に書き換えることができます。
;with cte as (
SELECT employeeID, AVG (Salary) as AvgSalary
FROM Salaries
GROUP BY employeeID
)
select employeeID as ID
, RANK() OVER (ORDER BY AvgSalary DESC) as Value
--, AvgSalary
from cte
この場合、CTE で従業員別の平均給与が計算され、ランキング列でクエリが拡張されますValue
。partition by employeeID
over句に追加:
;with cte as (
SELECT employeeID, AVG (Salary) as AvgSalary
FROM Salaries
GROUP BY employeeID
)
select employeeID as ID
, RANK() OVER (partition by employeeID ORDER BY AvgSalary DESC) as Value
--, AvgSalary
from cte
結果セットのすべての行につながりValue = 1
ます (これは達成しようとしているようには見えません)。これは、rank()
各 distinct の番号付けを 1 にリセットし、ランキングの前にこの列によってデータが集計されたため、すべての行で異なるためです。 .employeeID
employeeID