회원이름 하고 점수가 있는 테이블이 있습니다.
점수로 랭킹을 구분할려고 하는데요
내림차순으로 정렬하면 되지만..
만약에 회원이 100명이 있다 여기서 자신이 50위라면
48~52위 만 출력 할려고 하는데
어떻게 해야 할 지 감이 오질 않습니다.. 고수님들 쿼리좀 날려주세요..^^
자기의 등수 구하고
where 등수 > 자기등수 -2 and 등수 < 자기등수+2
이런건 안되나요?
테이블은 회원이름 , 점수 로만 되어 있습니다.
자기등수를 확인하는 쿼리도 필요 할 것 같습니다.
책한권 혹시 사보시겠어요?
이런거 많은 예제가 있거든요 ^^
deep inside t-sql 손호성
create table 랭킹(idx int identity,uname char(10),upoint int)
-- drop table 랭킹
declare @i int declare @uname char(10)declare @sql varchar(1000)set @i = 1 set @uname = 'aaa'print @sqlwhile @i <= 100 begin set @uname ='uname' + rtrim(cast(@i as char(3))) set @sql = 'insert into 랭킹 values (''' + rtrim(@uname) + '''' + ',' + rtrim(cast(@i as char(3))) + ')' print @sql exec (@sql) set @i = @i +1 end
-- select * from 랭킹 -- 테이블 만들어 테스트
-- ------------------------------------------------------------------------------------------ 여기서 부터 실행 영역 -- ----------------------------------------------------------------------------------------
declare @idx int , @upoint intdeclare @tidx int -- for debug -- 구할넘 idxset @idx = 50
create table #tmptable(tidx int identity, idx int )
if exists ( select a.idx from ( select top 60 idx from 랭킹 order by upoint desc ) a where a.idx = @idx )begin print '등수안에 있군 찾아볼까?' insert into #tmptable (idx) select top 60 idx from 랭킹 order by upoint desc select @tidx=tidx from #tmptable where idx = @idx set @tidx = @tidx
select a.tidx , b.* from ( select cast(tidx as char(3)) + '등' tidx , idx from #tmptable where tidx >= @tidx-2 and tidx <= @tidx+2 ) a inner join 랭킹 b on a.idx = b.idx order by b.upoint desc
endelse begin print '이넘은 제한된 등수내에 없습니다.'end
drop table #tmptable
-- ------------------------------------------------------------------------------------------ 여기서 부터 실행 영역 -- ---------------------------------------------------------------------------------------- END
등수안에 있군 찾아볼까?
(60 row(s) affected)
tidx idx uname upoint ----- ----------- ---------- ----------- 49 등 52 uname52 5250 등 51 uname51 5151 등 50 uname50 5052 등 49 uname49 4953 등 48 uname48 48
(5 row(s) affected)
이걸 수정해서 프로시져 만들어 쓰세요
저장프로시져 만들줄 아실지 모르겠네요 .........
이번기회에 만들어 보세요
쉽습니다.
문제)
테이블(회원이름, 점수)
점수로 Ordering하여 50위라면 48~52위만 출력한다.
가정)
회원이름은 unique 칼럼으로 가정한다.
문제해석)
1. 동일 점수는 없는가? => 아마도 있겠죠.. 그럼 복잡해집니다.. -_-;;
2. 동일 점수가 존재할 경우,
2-1. 주어진 회원과 동일 점수의 회원이 6개 이상일 경우, 원하는 데이터는 5개인가? 아니면, 동일 점수의 회원 정보 모두인가? 만약 5개라면 5개의 추출기준은 무엇인가?
2-2. 주어진 회원과 동일 점수의 회원 수가 2, 3, 4개 일 경우와 주어진 회원의 상(하)위 점수가 다시 동일 점수의 회원들로 구성될 경우의 처리 기준을 정해야 함.
이렇게 해서 주어진 문제에 대한 답안 혹은 처리 과정이 명시화 된다면, programming은 별 문제 없을 겁니다..
그럼..
이런 건 어떨까요?
/* rank앞뒤구하기 */select *from (/* 특정인 순위 */ select * from ( select a.kname ,a.score ,count(*) rank from tab1 a ,tab1 b where (b.score > a.score or b.kname = a.kname ) group by a.kname, a.score ) a where a.kname = '이름' ) a ,(/* 전체범위 순위 */ select a.kname ,a.score ,count(*) rank from tab1 a ,tab1 b where (b.score > a.score or b.kname = a.kname ) group by a.kname, a.score ) bwhere b.rank between (a.rank - 2) and (a.rank + 2)order by rank