Set-Based Approach
오라클/SQL 튜닝 2010/12/09 18:23
create table orders(
member_no number, -- 회원번호
order_no number, -- 주문번호
order_date date -- 주문일자
);
2. 아래 질문을 집합적 사고에 기반한 SQL 문으로 작성해 보세요.
- 100번 회원의 주문 간격의 평균값은 무엇입니까?
- 2010년 12월 10일 - 2010년 12월 1일 = 10일
- 2010년 12월 15일 - 2010년 12월 10일 = 5일
- 따라서 평균 = (10 + 5) / 2 = 7.5일
select
avg(trunc(order_date) - trunc(prev_order_date)) avg_order_between -- (현재일자 - 이전일자)의 평균
from (
select
order_date, -- 현재 주문일자
lag(order_date, 1, order_date) over (partition by member_no order by order_date
as prev_order_date -- 이전 주문일자
from
orders
where
member_no = 100
);
사실 위의 문장은 집합적 사고에 조금 실패한 정도가 아니라, 완벽하게 프로시저적인 방법(한단계 한단계씩 실행하는 방식)입니다.
그렇다면 완벽한 집합적 사고에 의해 작성된 SQL 문장은 무엇일까요? 책에서 제시한 정답은 다음과 같습니다.
...
...
...
...
select
(max(trunc(order_date)) - min(trunc(order_date))) / count(*) as avg_order_between
from
orders
where
member_no = 100
;
어떠신가요? 집합적 사고에 성공하셨나요?
'오라클 > SQL 튜닝' 카테고리의 다른 글
| Set-Based Approach (17) | 2010/12/09 |
|---|---|
| Missing Value 채우기와 Row를 Column으로 변환하기 - Partition Outer Join과 listagg 함수의 조합의 예 (0) | 2010/12/07 |
| Column의 값을 Row로 변환하기 (1) | 2010/12/03 |
| Recursive Subquery Factoring의 한가지 활용 예 (5) | 2010/12/01 |
| 오라클 실행 계획을 보는 새로운 방법 (10) | 2010/11/29 |
Trackback Address :: http://ukja.tistory.com/trackback/362
- Tracked from @@~ 2010/12/15 16:05 DELETE
Subject: ??
1부터 100까지 더하는 프로그램을 짜라면 많은 프로그래머들이 다음과 같이 for 루프로 1부터 100까지 돌면서 합을 구하는 형식으로 코드를 작성할 것이다. def sum1(n): s = 0 for i in range(1, n+1): s += i return s 컴퓨터는 이런 식의 반복 계산을 잘 하므로 작은 수에 대해서는 이렇게 작성해도 큰 상관은 없을 것이다. 물론 비효율적이기는 하지만. 좀더 효율적으로 작성하려면 간단한 공식을 이용하면 된다...


의 



