Oracle 분석함수 Mysql로 변환시 변수 문제 0 3 2,172

by cuteleem [2015.05.06 16:34:03]


이미지 8.png (24,890Bytes)
이미지 9.png (13,482Bytes)

계절별 첫 달을 Mysql 로 구하고 있는데 rank가 1일 경우 변수에 첫달을 담고 있는데 2번째 달로 변수에 담기네요;; Mysql 은 잘 몰라서 여쭤봅니다 이럴경우 어디서 초기화 또는 수정을 해 주는것이 좋은건가요?
by 마농 [2015.05.06 17:13:04]

1. MySQL 이라서 오류가 안나는 부분이 있네요.
  - 원래대로라면 a.month 가 Group By 구문에 포함되어야 하구요.
2. id 자체가 유니크한걸로 보이네요.
  - 월의 숫자를 의미하는것으로 판단 되구요
  - ORDER BY id, season, month 는 ORDER BY id 만 해도 되구요.
  - a.rn >= b.rn 은 굳이 rn 이 필요 없이 a.id >= b.id 해도 되겠네요.
3. Case 문의 모호하네요.
  - Then 절엔 대입식이 오고 Else 절엔 변수만 달랑 왔네요.
  - 양쪽의 형식을 맞춰줘야 할 듯 하네요.
4. 1번과 3번의 모호성 때문에 쿼리 결과가 예측하지 못한 방향으로 흘러간게 아닐까? 생각되는데요.
  - MySQL 은 모호하게 작성된 부분도 오류 없이 결과가 나오는게 신기할 따름입니다.
  - 에러가 나면 차라리 나을 텐데요.
  - 모호성을 제거해 보세요.
5. 기타사항으로는 시즌의 첫 시작을 뽑는거라면?
  - 겨울의 시작은 1월이 아니라 12월이죠.
  - 12월을 1월의 앞에 위치시키려면 id를 0으로 변형시켜야 할 듯.


by 마농 [2015.05.06 18:05:26]
-- 변수를 사용한다면? 굳이 Self Join 을 할 이유가 없죠.
SET @rn := 0, @fv := '', @season := '';

SELECT id, season, month
     , @rn := CASE @season WHEN season THEN @rn+1 ELSE 1 END AS rn
     , @fv := CASE @rn WHEN 1 THEN month ELSE @fv END AS first_value
     , @season := season
  FROM (SELECT * FROM test ORDER BY id%12) a
;


-- 변수 사용 없이 풀어 봤습니다.
SELECT a.id, a.season, a.month
     , COUNT(*) rn
     , SUBSTRING(MIN(CONCAT(LPAD(b.id%12, 2, '0'), b.month)), 3) x
  FROM test a
 INNER JOIN test b
    ON a.season = b.season
   AND a.id%12 >= b.id%12
 GROUP BY a.id, a.season, a.month
;

 


by cuteleem [2015.05.07 13:03:32]

정말 대단하시네요^^

마니 배워야 할거 같아요^^

감사합니다 ^^

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