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
운영게시판
최근게시물
Sybase Q&A 1032 게시물 읽기
No. 1032
한 레코드에서 가장 큰 값 두 개 구할려면?
작성자
어리버리
작성일
2004-12-14 20:50
조회수
7,199

안녕하세요...

 

예를들어 하나의 record에 no_1,no_2,no_3,no4,no5_에 명명된 컬럼에 숫자형래로 자료가 입력 되어 있는데..

 

5개 중에서 가장 큰 값 두개를 선택하여면 어떻게 해야 하나요?

 

아무리 생각 해 봐도 머리가 안굴러 가네요...

 

이상입니다. 감사합니다.

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

ASE인 ASA 인지 글구 버전이 뭔지 모르겠지만

이런 식으로 작업하면 되지 않을까요.

참고하세요.

ASA 인 경우는 top 2 을 사용하면 되지만

ASE 인 경우는 temp table 에 넣야 되지 않을 까요

insert into t1 (c1,c2,c3,c4,c5) values (1,2,3,4,5)

go

select * from (select c1 c from t1 
                     union
                     select c2 c from t1
                     union
                     select c3 c from t1
                     union
                     select c4 c from t1
                     union
                     select c5 c from t1) a
order by a.c desc
남상진(uecho71)님이 2004-12-15 10:00에 작성한 댓글입니다.

변수 선언을 해서 작업을 하시면 간단히 해결될거 같은데요..

변수 선언을 하고 application 에서 sorting 로직을 사용하시면 될거 같은데.. 제가 지금 시간이 없어서. --; 간단히 방법만 몇가지 말씀드리죠..

 

이런 방법 말고도 여러가지 방법은 있을거 같습니다..

 

예를 들어 cursor 를 선언하고.. fetch 를 하면서 한 row 를 채 column 형태로 변경을 합니다..

aaa         bbb         ccc        
----------- ----------- -----------
          1           2           3
          6           5           4
          7           6           7

이런 data 가 있다고 가정할때

cursor 선언 후 Fetch 하면서

 

select aaa col1

  into #temp

  from aaa1

union all

select bbb col1

  from aaa1

union all

select ccc col1

  from aaa1

 

select MAX(col1) ==> 최대

     ( select MAX(col1) from #temp where col1 < ( select MAX(col1) from #temp )) ==> 두번째

from #temp

 

이런식도 될거 같구요..

 

꼭 한문장으로 만 해야 한다면...

 

select case when case when aaa >= bbb then aaa else bbb end >= ccc then case when aaa >= bbb then aaa else bbb end else ccc end 
   from aaa1 ==> 최대값 등등 방법은 여러 가지가 있을거 같은데..

 

DB 에서 Data select 후 ap 에서 sorting 로직을 쓰는 방법이 제일 좋을거 같네요.. --; sorting logic 은 internet 에 찾아보시면 많이 있습니다.

coolrock님이 2004-12-15 10:32에 작성한 댓글입니다. Edit

create table seo(a varchar(10),b int)

임시저장 할 테이블 하나 만들고요

 

 

1>select convert(varchar(10),getdate(),108)
set rowcount 2
insert seo select 'one',one from numbers order by one desc
insert seo select 'two',two from numbers order by two desc
insert seo select 'three',three from numbers order by three desc
insert seo select 'four',four from numbers order by four desc
insert seo select 'five',five from numbers order by five desc
select * from seo order by b
set rowcount 0
select convert(varchar(10),getdate(),108)

2> go

 ----------
 18:54:06

(1 row affected)
(2 rows affected)
(2 rows affected)
(2 rows affected)
(2 rows affected)
(2 rows affected)
 a          b
 ---------- -----------
 one                999
 one                999

(2 rows affected)

 ----------
 18:54:06

(1 row affected)

1초도 안걸리네요....

 

지연님이 2004-12-20 18:58에 작성한 댓글입니다. Edit

안녕하세요? 이전에 저희 사이트로 문의하신 동일한 질문에 답을 올렸는데, 제가 엉뚱한 글을 올려서(야간작업의 연속 여파 --) 좀 당황했습니다. 그런데 이미 보고 인사하시고 가셨더군요... 크게 도움은 되지 않을 것 같지만 답변을 정상적으로 수정하였으니 한번 들러주십시오. 광고성 같아서 사이트는 공개하지 않겠습니다만, 질문하신 분과 지연님은 말씀 드리지 않아도 아실 것 같습니다. 그리고 혹시 더 좋은 방법이 있다면 발자취 남겨 주시면 감사하겠습니다. 추운데 수고들 많으십니다 그럼 이만 (--)(__)

KMJEAN님이 2004-12-21 02:31에 작성한 댓글입니다. Edit

이상하네요.. ^^

 

암만해도 column 들 중에서 가장 큰값 두개가 아니라..

row 단위에서 두개를 구하는거 같은데..

 

one    tow   three four  five

-------------------------

1         3         5     4       2

7         8         6     9        1

 

이런식이면  1 row 에서 5  4

                  2 row 에서 9  8 

이런식의 Data 를 원하는 물음이 아닌 가요 ?

 

???님이 2004-12-21 17:07에 작성한 댓글입니다. Edit

그렇군요, 제가 질문을 잘못 이해 했군요...

temp table로 만들어 봤습니다..

seo에 한 31000여건을 insert하고 작업을 했습니다.


create table seo (name varchar(100),one int,two int,three int,four int,five int)
create table #one(name varchar(10),gubun varchar(10), num int)
create table #result( name varchar(10),max1 int,max2 int null)


insert #one select  name,'one',one  from seo
insert #one select  name,'two',two  from seo
insert #one select  name,'three',three from seo
insert #one select  name,'four ',four from seo
insert #one select  name,'five',five  from seo

create index one_i on #one(name,num)
insert #result(name,max1) select name ,max(num) from #one group by name
delete #one  from #one a ,#result b where a.name=b.name and a.num=b.max1
update #result set max2=
(select max(num) from #one where #one.name=a.name) from #result a ,#one b where a.name=b.name

select * from #result

 

시간은 안재봤는데...한 3초(서버에 따라 다르겠지만요, 약간 무식한 방법이긴 한데...생각보다 빠르네요)

지연님이 2004-12-22 14:50에 작성한 댓글입니다.
이 댓글은 2004-12-22 14:52에 마지막으로 수정되었습니다. Edit
[Top]
No.
제목
작성자
작성일
조회
1037ASA 6.0 한글 문제 [1]
송재열
2004-12-24
4293
1036[질문]linux에서 원격 sybase서버에 접속할려고 sybase.pm을 설치
강호영
2004-12-22
4144
1034sybase 기동절차좀....(완전초보) [1]
한택상
2004-12-21
6923
1032한 레코드에서 가장 큰 값 두 개 구할려면? [6]
어리버리
2004-12-14
7199
1031[질문]PHP와 Adaptive Server Anywher 8 의 연결 방법을 알고싶습니다. [2]
이정훈
2004-12-13
4347
1030테이블 변경일자 질문요... [1]
궁금이
2004-12-09
4003
1029오라클의 user_tab_columns 에 해당하는 테이블 정보 어떻게 보나요? [2]
BBung
2004-12-08
5028
Valid XHTML 1.0!
All about the DATABASE... Copyleft 1999-2024 DSN, All rights reserved.
작업시간: 0.020초, 이곳 서비스는
	PostgreSQL v16.2로 자료를 관리합니다