database.sarang.net
UserID
Passwd
Database
DBMS
MySQL
PostgreSQL
Firebird
Oracle
Informix
Sybase
ㆍMS-SQL
DB2
Cache
CUBRID
LDAP
ALTIBASE
Tibero
DB 문서들
스터디
Community
공지사항
자유게시판
구인|구직
DSN 갤러리
도움주신분들
Admin
운영게시판
최근게시물
MS-SQL Q&A 2135 게시물 읽기
No. 2135
회원이름 하고 점수가 있는 테이블에서 정렬하기...
작성자
최중권(choi1024)
작성일
2005-07-20 17:33
조회수
4,030

회원이름 하고 점수가 있는 테이블이 있습니다.

 

점수로 랭킹을 구분할려고 하는데요

 

내림차순으로 정렬하면 되지만..

 

만약에 회원이 100명이 있다 여기서 자신이 50위라면

 

48~52위 만 출력 할려고 하는데

 

어떻게 해야 할 지 감이 오질 않습니다.. 고수님들 쿼리좀 날려주세요..^^

이 글에 대한 댓글이 총 7건 있습니다.

자기의 등수 구하고

 

where 등수 > 자기등수 -2 and 등수 < 자기등수+2

이런건 안되나요?

 

석이님이 2005-07-20 17:37에 작성한 댓글입니다. Edit

테이블은 회원이름 , 점수 로만 되어 있습니다.

 

자기등수를 확인하는 쿼리도 필요 할 것 같습니다.

최중권(choi1024)님이 2005-07-20 17:49에 작성한 댓글입니다.

책한권 혹시 사보시겠어요?

이런거 많은 예제가 있거든요 ^^

deep inside t-sql 손호성

석이님이 2005-07-20 17:52에 작성한 댓글입니다. Edit

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   @sql
while @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 int
declare @tidx int
-- for debug
-- 구할넘 idx
set @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

end
else begin
 print '이넘은 제한된 등수내에 없습니다.'
end

drop table #tmptable

-- ----------------------------------------------------------------------------------------
-- 여기서 부터 실행 영역
-- ---------------------------------------------------------------------------------------- END

 

 

 

등수안에 있군 찾아볼까?

(60 row(s) affected)

tidx  idx         uname      upoint     
----- ----------- ---------- -----------
49 등  52          uname52    52
50 등  51          uname51    51
51 등  50          uname50    50
52 등  49          uname49    49
53 등  48          uname48    48

(5 row(s) affected)

 

석이님이 2005-07-20 21:04에 작성한 댓글입니다. Edit

이걸 수정해서 프로시져 만들어 쓰세요

저장프로시져 만들줄 아실지 모르겠네요 .........

이번기회에 만들어 보세요

쉽습니다.

 

석이님이 2005-07-20 21:06에 작성한 댓글입니다.
이 댓글은 2005-07-20 21:09에 마지막으로 수정되었습니다. Edit

문제)

테이블(회원이름, 점수)

점수로 Ordering하여 50위라면 48~52위만 출력한다.

 

가정)

회원이름은 unique 칼럼으로 가정한다.

 

문제해석)

1. 동일 점수는 없는가? => 아마도 있겠죠.. 그럼 복잡해집니다.. -_-;;

2. 동일 점수가 존재할 경우,

  2-1. 주어진 회원과 동일 점수의 회원이 6개 이상일 경우, 원하는 데이터는 5개인가? 아니면, 동일 점수의 회원 정보 모두인가? 만약 5개라면 5개의 추출기준은 무엇인가?

  2-2. 주어진 회원과 동일 점수의 회원 수가 2, 3, 4개 일 경우와 주어진 회원의 상(하)위 점수가 다시 동일 점수의 회원들로 구성될 경우의 처리 기준을 정해야 함.

 

이렇게 해서 주어진 문제에 대한 답안 혹은 처리 과정이 명시화 된다면, programming은 별 문제 없을 겁니다..

 

그럼..

길가는 나그네..님이 2005-07-21 12:02에 작성한 댓글입니다.
이 댓글은 2005-07-21 12:04에 마지막으로 수정되었습니다. Edit

이런 건 어떨까요?

 

/* 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
     ) b
where b.rank between (a.rank - 2) and (a.rank + 2)
order by rank

m님이 2005-07-21 15:29에 작성한 댓글입니다. Edit
[Top]
No.
제목
작성자
작성일
조회
2139인덱스(index) 삭제하는 방법 [2]
신현주
2005-07-22
2488
2138datetime 데이터에서 최근 며칠 데이터 가져오기 [1]
헌터
2005-07-21
3083
2137서버 백업에 관해서... [1]
남용욱
2005-07-21
3563
2135회원이름 하고 점수가 있는 테이블에서 정렬하기... [7]
최중권
2005-07-20
4030
2134remote에 있는 데이타를 가져올때의 속도문제 [1]
pray4peace
2005-07-20
2423
2132부탁드립니다. 수고하세요.. [7]
row
2005-07-20
7921
2131DB를 실시간 백업받고자 합니다. [3]
궁금이
2005-07-20
3531
Valid XHTML 1.0!
All about the DATABASE... Copyleft 1999-2024 DSN, All rights reserved.
작업시간: 0.016초, 이곳 서비스는
	PostgreSQL v16.2로 자료를 관리합니다