DRWNO | BNUSNO_1 | BNUSNO_2 | BNUSNO_3 | BNUSNO_4 | BNUSNO_5 | BNUSNO_6 |
---|---|---|---|---|---|---|
1 | 15 | 32 | 12 | 35 | 43 | 41 |
2 | 12 | 13 | 14 | 15 | 44 | 17 |
3 | 12 | 30 | 34 | 35 | 42 | 44 |
table 명은 NUMBER 입니다.
위와 같이 BNUSNO 라고 하는 6개 컬럼이 있는데 해당 숫자의 개수를 랭킹으로 나타내고 싶습니다. 10개까지만요.
중복같은 경우는 같은 순위로 매기고 싶고요.
Oracle 에서는 rank 함수를 쓰는데 MYSQL 에서는 서브쿼리 등 다르게 써야할거 같은데 어떻게 하는게 좋을지 문의 드립니다.
SELECT * FROM (SELECT bnusno , @rn := @rn + 1 AS rn , @rk := CASE WHEN cnt = @cnt THEN @rk ELSE @rn END AS rk , @cnt := cnt AS cnt FROM (SELECT CASE lv WHEN 1 THEN bnusno_1 WHEN 2 THEN bnusno_2 WHEN 3 THEN bnusno_3 WHEN 4 THEN bnusno_4 WHEN 5 THEN bnusno_5 WHEN 6 THEN bnusno_6 END bnusno , COUNT(*) cnt FROM t a CROSS JOIN (SELECT 1 lv UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL SELECT 4 UNION ALL SELECT 5 UNION ALL SELECT 6 ) b GROUP BY bnusno ORDER BY cnt DESC, bnusno DESC ) a , (SELECT @rn := 0, @rk := 0, @cnt := 0) b ) a WHERE rk <= 10 ;