2011-04-14 2 views
0

데이터 쿼리를 구성하거나 데이터를 그룹화하는 데 가능한 한 적은 수의 쿼리를 구성하고 싶습니다. 주어진 버킷 수를 감안할 때 특정 열을 기반으로 결과를 반환하고 싶습니다.세그먼트 값에 대한 쿼리 결과 열 값의 균등 집합을 기반으로

그래서 포함하는 이중 인 열이라는 점수 부여 :

90.00 
91.00 
94.00 
96.00 
98.00 
99.00 
나는 같은 기능을 GROUP BY 절을 사용할 수 있도록하고 싶습니다

:

SELECT MIN (점수), MAX (점수), SUM (점수) GROUP BY BUCKETS GROUP BY BUCKETS (점수, 3)

이상적으로 이것은 3 개의 행을 반환합니다 (결과를 가능한 한 각 그룹에 같은 개수만큼 3 개의 버킷으로 그룹화 함)) :

90.00, 91.00, 181.00 
94.00, 96.00, 190.00 
98.00, 99.00, 197.00 

이렇게 할 수있는 기능이 있습니까? 모든 행을 반환하지 않고 버킷 세그먼트를 직접 알아내는 것을 피하고 싶습니다. 당신이 그것을 모방하는 몇 가지 변수를 사용 할 수 있도록

데이브

답변

1
create table test (
id int not null auto_increment primary key, 
val decimal(4,2) 
) engine = myisam; 

insert into test (val) values 
(90.00), 
(91.00), 
(94.00), 
(96.00), 
(98.00), 
(99.00); 

select min(val) as lower,max(val) as higher,sum(val) as total from (
select id,val,@row:[email protected]+1 as row 
from test,(select @row:=0) as r order by id 
) as t 
group by ceil(row/2) 

+-------+--------+--------+ 
| lower | higher | total | 
+-------+--------+--------+ 
| 90.00 | 91.00 | 181.00 | 
| 94.00 | 96.00 | 190.00 | 
| 98.00 | 99.00 | 197.00 | 
+-------+--------+--------+ 
3 rows in set (0.00 sec) 

불길에 MySQL은 ROWNUM 같은 분석() 함수를 가지고 있지 않습니다. 일단 그렇게하면 ceil() 함수를 사용하여 모든 행을 원하는대로 그룹화 할 수 있습니다. 그것이 나의 영어에도 불구하고 도움이되기를 바란다.

set @r = (select count(*) from test); 
select min(val) as lower,max(val) as higher,sum(val) as total from (
select id,val,@row:[email protected]+1 as row 
from test,(select @row:=0) as r order by id 
) as t 
group by ceil(row/ceil(@r/3)) 

또는 단일 쿼리

select min(val) as lower,max(val) as higher,sum(val) as total from (
select id,val,@row:[email protected]+1 as row,tot 
from test,(select count(*) as tot from test) as t2,(select @row:=0) as r order by id 
) as t 
group by ceil(row/ceil(tot/3)) 
+0

아와. 그것은 꽤 가깝지만 2를 반환하면 2 행을 반환하고, 3은 3 행을 반환해야합니다. 생각은 테이블에있는 행 수나 열의 값 분포를 모를 수 있다는 것입니다. – Dave

+0

제발 용서해주세요.하지만 이해가 안되네. : ( –

+0

다른 검색어를 추가했습니다. 이해해 주셨으면합니다. :) –

관련 문제