태터데스크 관리자

도움말
닫기
적용하기   첫페이지 만들기

태터데스크 메시지

저장하였습니다.

Set-Based Approach

오라클/SQL 튜닝 2010/12/09 18:23
SQL을 효과적으로 작성하는 방법은 집합적 사고(Set-Based Approach)를 사용하는 것이라고 하죠.

오늘 어떤 책을 보다가 아주 재미있는 예제를 봤습니다. 아래 문제를 손쉽게 푸신다면 집합적 사고에 능숙하다고 할 수 있겠습니다.

1. 아래와 같은 테이블 ORDERS가 있습니다.

create table orders(
    member_no     number, -- 회원번호
    order_no        number, -- 주문번호
    order_date     date -- 주문일자
);
2. 아래 질문을 집합적 사고에 기반한 SQL 문으로 작성해 보세요.
  • 100번 회원의 주문 간격의 평균값은 무엇입니까?
즉, 2010년 12월 1일, 2010년 12월 10일, 2010년 12월 15일 이렇게 세번 주문했다면 이렇게 되겠죠?
  • 2010년 12월 10일 - 2010년 12월 1일 = 10일
  • 2010년 12월 15일 - 2010년 12월 10일 = 5일
  • 따라서 평균 = (10 + 5) / 2 = 7.5일
자신만의 SQL 문장을 잠시 생각해보세요.

...

...

...

...

만일 다음과 같은 문장을 생각했다면 SQL 작성에는 능숙할지 모르겠지만 집합적 사고에는 실패하신 겁니다.

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
;
어떠신가요? 집합적 사고에 성공하셨나요?
저작자 표시
Trackback 1 : Comments 17

Trackback Address :: http://ukja.tistory.com/trackback/362 관련글 쓰기

  1. 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 컴퓨터는 이런 식의 반복 계산을 잘 하므로 작은 수에 대해서는 이렇게 작성해도 큰 상관은 없을 것이다. 물론 비효율적이기는 하지만. 좀더 효율적으로 작성하려면 간단한 공식을 이용하면 된다...
  1. maceo 2010/12/09 20:58 Modify/Delete Reply

    혹시 어떤 책을 보고 계신지 알 수 있을까요???

  2. 욱짜 2010/12/10 09:38 Modify/Delete Reply

    Pro Oracle SQL이라는 신간입니다.
    http://www.amazon.com/gp/product/1430232285/ref=s9_simh_gw_p14_d3_i1?pf_rd_m=ATVPDKIKX0DER&pf_rd_s=center-2&pf_rd_r=18643QB18H4MJRK75RPQ&pf_rd_t=101&pf_rd_p=470938631&pf_rd_i=507846
    책 자체는 비추입니다. ㅎㅎ

  3. 조용중 2010/12/10 11:00 Modify/Delete Reply

    어라 결과가 틀린데...라는 생각에 내가 뭘 잘못했나라며 자책하길 10여분...
    2010년 12월 10일 - 2010년 12월 1일 = 10일 인데,
    2010년 12월 15일 - 2010년 12월 10일 = 5일 이 된 연산에 문제 있었습니다.
    위에가 9일인것같습니다만...^^;
    물론 프로시저적인 방법이 떠올랐고, 집합적 해답도 이해하는데 한참 걸렸네요...
    항상 좋은 글 감사합니다.

    • 욱짜 2010/12/10 11:23 Modify/Delete

      ㅎㅎ 그렇군요!

      책의 예제를 보고 소개하면 많은 분들이 머리를 딱 칠거 같은 느낌이 들었습니다.

  4. 한현규 2010/12/14 15:47 Modify/Delete Reply

    근데 count(*) - 1 로 나누는 게 맞을 것 같은데요.

    앗. count(*)가 1이면 0이되네요.

    그럼.. decode(count(*), 1, 1, count(*)-1) 로 나눠야할 것 같은데요. 어떻게 생각하세요 ?

    • 욱짜 2010/12/15 10:26 Modify/Delete

      진짜 그러네요!

      count(*)가 1 이면 평균의 의미가 없군요.

  5. ukdissertationwritinghelp 2011/01/25 15:00 Modify/Delete Reply

    관리자의 승인을 기다리고 있는 댓글입니다

  6. ukdissertationwritinghelp 2011/01/25 15:00 Modify/Delete Reply

    관리자의 승인을 기다리고 있는 댓글입니다

  7. term paper assignment 2011/04/09 18:54 Modify/Delete Reply

    관리자의 승인을 기다리고 있는 댓글입니다

  8. 1 2011/04/22 09:37 Modify/Delete Reply

    관리자의 승인을 기다리고 있는 댓글입니다

  9. 생각하게 하는 글 2011/08/10 20:45 Modify/Delete Reply

    관리자의 승인을 기다리고 있는 댓글입니다

  10. TOP 1 Oli Sintetik Mobil-Motor Indonesia 2011/10/13 11:59 Modify/Delete Reply

    관리자의 승인을 기다리고 있는 댓글입니다

  11. Assignment 2011/12/28 18:21 Modify/Delete Reply

    관리자의 승인을 기다리고 있는 댓글입니다

  12. details here 2012/05/10 05:10 Modify/Delete Reply

    관리자의 승인을 기다리고 있는 댓글입니다

  13. nhà hàng cưới 2012/07/13 15:30 Modify/Delete Reply

    관리자의 승인을 기다리고 있는 댓글입니다

  14. 장우성 2012/10/06 14:30 Modify/Delete Reply

    관리자의 승인을 기다리고 있는 댓글입니다

  15. cong ty du lich tphcm 2012/12/24 11:09 Modify/Delete Reply

    관리자의 승인을 기다리고 있는 댓글입니다

Write a comment

◀ PREV : [1] : [2] : [3] : [4] : [5] : ... [354] : NEXT ▶

티스토리 툴바