2013-12-14 2 views
1

데이터베이스가 db이고 그 테이블에 테이블이 있습니다.MySQL에서 열의 중간 값을 찾는 PHP 함수

id | val 
-------- 
1 | 45 
2 | 35 
3 | 23 
4 | 49 
5 | 67 
6 | 12 
7 | 0 
8 | 87 
9 | 46 

(... 이것은 실제 데이터 세트가 크다 설정 단지 예를 들어 데이터입니다 그리고 가능한 최소한의 시간을 일할 필요)

내가 찾을 필요가 :

그것은 다소처럼 보이는 란의 중간 값 val. 실제로 여러 번 사용하는 PHP 함수가 필요합니다.

비슷한 질문은 존재 :

Simple way to calculate median with MySQL 나는이 질문에 몇 가지 답변을 시도, 그들 중 누구도 나를 위해 일하지 않는다. 허용 된 응답은 SQL의 이전 버전에서만 작동하기 때문에 작동하지 않습니다.

추신 : 많은 중복의 경우에도 작동해야합니다.

+0

PHP에서 그냥하고 싶다면 모든 값을 빼고, 배열에 넣고, 배열을 정렬하고, 중앙값을 찾으십시오. – user602525

+0

그렇게 느리지 않니? 정렬하고 중간 값을 찾으십니까? – Ranveer

+0

글쎄 데이터 세트에 따라 다릅니다. 나는 지금 당장 일어난 일을 토대로 갈거야. – user602525

답변

0

는 단지 재미를 위해 내가 여기 t1을 변경하지 마십시오 sqlFiddle

SELECT 
    CASE 
    WHEN MOD((select count(*) as count from t),2)=1 THEN 
     (select val from 
      (select @row:[email protected]+1 as row,val 
      from t,(select @row:=0)r 
      order by val)t1 
     where t1.row = CEIL((select count(*) as count from t)/2) 
    ) 
    ELSE 
     ((select val from 
      (select @row:[email protected]+1 as row,val 
      from t,(select @row:=0)r 
      order by val)t1 
     where t1.row = (select count(*) as count from t)/2)+ 
     (select val from 
      (select @row:[email protected]+1 as row,val 
      from t,(select @row:=0)r 
      order by val)t1 
     where t1.row = ((select count(*) as count from t)/2)+1))/2 
    END AS median 

그냥 테이블 이름으로 t의 발행 수를 바꾸기 ', 내가 시도와 MySQL에서 모든 것을 할 생각. 또한 테이블에 행이 없으면 중간 값으로 NULL이 반환됩니다.

이 질의는 또한 그것은 2 열하는 rowcount 열과 median 열을 반환 것 아래 (sqlFiddle)

SELECT @rowCount:=(select count(*) as count from t) AS rowcount, 
     (select AVG(val) from 
      (select @row:[email protected]+1 as row,val 
      from t,(select @row:=0)r 
      order by val)t1 
     where t1.row IN (FLOOR((@rowCount+1)/2), 
         CEIL((@rowCount+1)/2) 
         ) 
    ) as Median 

로 감소 될 수있다. 이전 쿼리와 같이 여러 번 계산하지 않으려 고했기 때문에 rowcount 열을 넣었습니다.

+0

무엇이 반환합니까? 저는 MySQL에 초보자입니다. PHP로 변환하는 데 어려움을 겪고 있습니다. – Ranveer

+0

알았어요! 결과를 배열로 변환하고 첫 번째 요소를 반환 값으로 사용했습니다. – Ranveer

+0

두 번째 쿼리는 첫 번째 쿼리 길이의 절반 정도이므로 두 번째 쿼리를 더 좋아할 수 있습니다. –

관련 문제