>source

select 문에서 특정 사용자의 평균을 선택한 다음 이전에 계산 된 평균과 현재 행의 분산을 계산하는 방법을 찾고 있습니다.

User 및 Attmept_Number는 복합 키입니다. 또한 이것은 SELECT 에서 수행해야합니다  또는 WHERE  절. FROM (SELECT...) 를 사용하는 솔루션을 알고 있습니다. 하지만이 경우 다른 해결책을 찾고 있습니다.

SELECT 
    User, 
    Attmept_Number, 
    (User_Score - AVG(User_Score)) As Variance
FROM Scores

위의 진술을 통해 사용자의 평균이 아닌 열 평균을 얻습니다. GROUP BY 를 추가하면  복합 키로 인해 문제가 발생합니다.

결과 :

User   Score   Variance
1      5       -6
1      10      -1
1      15      4
3      14      3

목표 :

User   Score   Variance
1      5       -5
1      10      0
1      15      5
3      14      0


  • 답변 # 1

    MySQL 8.0에서는 AVG(...) OVER(...) 창 함수를 사용하는 것만 큼 간단합니다 :

    SELECT
       user,
       score,
       score - AVG(score) OVER(PARTITION BY user) AS variance
    FROM scores
    
    

    이전 버전에서는 집계 하위 쿼리를 사용하여 사용자 당 평균을 계산 한 다음 JOIN  테이블과 함께 :

    SELECT
       s.user,
       s.score,
       s.score - t.avg_score AS variance
    FROM scores s
    INNER JOIN (
        SELECT user, AVG(score) avg_score FROM scores GROUP BY user
    ) t ON s.user = t.user
    
    

관련 자료

  • 이전 반응 형 번 들러가 멈춤
  • 다음 Keras/Tensorflow에서 텐서에 배치 차원을 (없음,) 다시 도입하는 방법은 무엇입니까?