1

次のようなコードを読むのに問題があります

SELECT 
    employeeID as ID,
    RANK() OVER (ORDER BY AVG (Salary) DESC) AS Value 
FROM Salaries 

おそらくすべての従業員の平均給与を取得します

私の理解では、コードは

SELECT 
    employeeID as ID,
    RANK() OVER (Partition By employeeID ORDER BY AVG (Salary) DESC) AS Value 
FROM Salaries 

しかし、上記のコードは問題なく動作しますか?

4

1 に答える 1

1

最初のものは私にとっては機能しません(メッセージ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 で従業員別の平均給与が計算され、ランキング列でクエリが拡張されますValuepartition by employeeIDover句に追加:

;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 にリセットし、ランキングの前にこの列によってデータが集計されたため、すべての行で異なるためです。 .employeeIDemployeeID

于 2013-09-02T13:44:21.463 に答える