MySQL에서 열의 중앙값을 어떻게 찾습니까?


10

나는 두 개의 데이터베이스 쿼리로 이것을하는 것을 상상할 수 있습니다. 첫 번째는 데이터베이스에서 행 수를 찾고 두 번째는 ORDER BY내가 관심있는 열에서 선택하고 LIMIT X, 1X는 행 수의 절반입니다.

하나의 쿼리 로이 작업을 수행하는 간단한 방법이 있습니까?

지금은 계산에 평균을 사용하고 있지만 평균이 더 좋을 것이라고 생각합니다. 값에 대한 상한이 없으며 아래에서 0으로 제한됩니다.


편집 : 네, 나는 '중간'이라고 말했지만 뇌 오류가 있었고 '평균'을 검색했습니다. 나는 지금 stackoverflow 에서 답을 찾았습니다.


meta조금 읽은 후에 는이 질문이 여기 또는 SO에 있어야하는 날씨에 관한 구분이있는 것 같습니다. 나는 이것이 닌자 수준의 쿼리 가 아닐 수도 있다는 것을 알고 있지만, 나는 그것이 혼란에 빠졌고 내가 일하는 회사에는 DBA가 없다 (총 6 명).
JIStone

답변:


6

MySQL 테이블에서 중간 값을 계산 하는 것에 대해서는 여기 에서 약간의 토론이 있습니다 . 페이지에서 '중앙값'을 검색하십시오.

제쳐두고, 이것을 수행하는 내장 함수가 없다는 것을 생각 나게합니다. 중앙값은 종종 평균보다 중심 경향을 더 잘 묘사합니다. Access / VBA의 기능 목록에는 동일한 구멍이 있습니다.


동의한다. 큰 쿼리로 작업 할 때 여분의 줄은 모든 것을 더 번거롭고 디버그 / 유지하기가 어렵게 만듭니다.
JIStone

2

단일 쿼리에서 중간 값을 얻는 관리 솔루션을 보지 못했습니다. 나는 임시 테이블을 신경 쓰지 않지만 필요하지 않으면 훌륭합니다! 내가 생각해 낸 것은 다음과 같습니다.

SELECT AVG(profit) median, nofitems FROM(
  SELECT x.profit, SUM(SIGN(1.0-SIGN(y.profit-x.profit))) diff, count(*) nofitems, floor(count(*)+1/2)
  FROM brand_prof x, brand_prof y
  GROUP BY x.profit
  HAVING SUM(SIGN(1.0-SIGN(y.profit-x.profit))) = floor((COUNT(*)+1)/2)
      OR SUM(SIGN(1.0-SIGN(y.profit-x.profit))) = ceiling((COUNT(*)+1)/2)
) x;

나는 이것을 짝수 세트로 테스트하고 정답을 얻었습니다. brand_prof는 brand_name과 profit, 10 진수 값의 두 열입니다. 이것이 정수 값이라면 "ceiling ((CAST COUNT (*) AS DECIMAL) ..."을 테스트해야 할 수도 있습니다. 테스트 한 것보다 더 많은 것입니다. 직교 곱을 사용하고 부호의 합계를 나타내는 멋진 아이디어는 안타깝게도 저자를 잊어 버렸습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.