튜닝 질문입니다.group by max 대신 order by desc 0 9 3,469

by 하라 [SQL Query] orderby tunning 튜닝 groupby group by [2018.07.03 15:11:57]


아래의 쿼리에서 트랜잭션아이디 별로 그룹핑을 한 후 판매번호가 가장 큰값의 열만 가져오려고 합니다만

아래의 group by 와 max 를 사용하지 않은 order by 와 top 으로 바꿀 수 있는 방법이 있을까요? 조언 부탁드립니다.

DBMS 는 sqlserver 입니다.

 

select 트랜잭션아이디,MAX(판매번호) as 판매번호

from 판매정보테이블

where 카드결제상태 not in ('00','01')

and isnull(deleteflag,0) <> 1

group by 트랜잭션아이디

 

by 우리집아찌 [2018.07.03 15:28:43]
select * 
  from (select 트랜잭션아이디,
               판매번호 ,
			   ROW_NUMBER() over(partition by 트랜잭션아이디 order by 판매번호 desc ) rn
		  from 판매정보테이블
		 where 카드결제상태 not in ('00','01')
		   and isnull(deleteflag,0) <> 1
		) z  
  where rn = 1 

 


by 하라 [2018.07.03 15:30:26]

조언 감사합니다

제가 dbms 를 안적었네요 ㅠㅠ mssql 입니다.


by 우리집아찌 [2018.07.03 15:33:07]

MS-SQL 도 ROW_NUMBER() OVER() 가능합니다. 

2008 R2에서는 돌아갑니다.

버젼이 어떻게 되시나요?

 


by 하라 [2018.07.03 15:34:50]

네 현재 2012 버전을 사용하고 있습니다.


by 우리집아찌 [2018.07.03 15:39:16]

그럼 충분히 사용 가능하십니다.


by 하라 [2018.07.03 15:47:02]

감사합니다 조언 주신대로 테스트 해보겠습니다.


by 하라 [2018.07.03 16:03:05]

결과 건수가 다르게 나오는군요 ㅠㅠ 감사합니다.


by 마농 [2018.07.03 15:53:14]

트랜잭션아이디만 유니크하게 가진 테이블이 별도로 있다면?
스칼라서브쿼리 형태로 가능하기는 합니다.
다만 데이터량? 인덱스 형태? 조건절 형태에 따라 어떤게 유리할지는 확인해 봐야 합니다.
 

SELECT *
  FROM (SELECT 트랜잭션아이디
             , (SELECT TOP 1
                       s.판매번호
                  FROM 판매정보테이블 s
                 WHERE 카드결제상태 NOT IN ('00','01')
                   AND ISNULL(s.deleteflag, 0) <> 1
                   AND s.트랜잭션아이디 = m.트랜잭션아이디
                 ORDER BY s.판매번호 DESC
                ) 판매번호
          FROM 트랜잭션정보테이블 m
        ) z
 WHERE z.판매번호 IS NOT NULL
;

기타사항으로. 부정 조건을 긍정 조건으로 바꿀 수 있는지? 검토해 보세요.
 - 부정조건 : 카드결제상태 NOT IN ('00','01')
 - 긍정조건 : 카드결제상태 IN ('02','03','04','05')
 - 긍정조건 : 카드결제상태 >= '02'


by 하라 [2018.07.03 16:05:11]

트랜잭션아이디 + 판매번호가 기본키로 되어있습니다. 

별도로 테이블은 없습니다 

카드 결제 조건을 긍정으로 변경은 가능합니다.

댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입