쿼리 질문입니다. MYSQL이라 그런가 많이 어렵네요.. 0 5 705

by 잼따군 [2017.08.08 20:32:04]


답은 MYSQL구문으로 해주셨으면 합니다..ㅠㅠ

 

컬럼 a.b가 있는데 GROUP BY b 하는데 개중에 a가 큰 로우를 셀렉트 하고 싶습니다.

 

 

id                           a                                b                           

-----------------------------------------------

1                           aa                                f                      

2                             a                                f

3                            bb                               g

4                            cc                                h

위와 같은 데이터가 존재할때 id 1,3,4로우만 셀렉 하고싶습니다.

즉 GROUP BY b 하는데 개중에 같은 로우가 존재하면 a가 큰 값을 가지고 있는 로우를 셀렉 하려는 겁니다.

지금 쿼리하는데 계속 2가 나와서..ㅠㅠ

rank같은 함수나 있으면 쉽게 할 수도 있을거 같은데.. mysql어렵네요..ㅠㅠ

오늘 하루종일 이것만 하고있습니다. 힌트좀 부탁드립니다 고수님들

by jkson [2017.08.08 20:44:46]

조건에 대한 설명이 너무 부족한데 같은 b 값에 대해서 가장 큰 a값을 select하시는 건가요?


by 잼따군 [2017.08.08 20:51:45]

급한 맘에 너무 질문을 막던졌네요.. 죄송합니다.

질문 수정 했습니다. 


by jkson [2017.08.08 21:18:06]

id 5에 aa, f 가 있으면 id 1인 데이터와 같이 나와야하나요 둘중 하나만 나오면 되는 건가요


by jkson [2017.08.08 22:21:43]

mysql 공부할 겸 해봤습니다.

더 좋은 방법이 있을 거예요.

-- 중복 값에 대해 1개만 나와야 할 경우
SELECT * 
  FROM
  (
  SELECT  @ROW_NUM := IF(@PREV_B=A.B,@ROW_NUM+1,1) AS RNUM
         ,A.ID
         ,A.A
         ,A.B
         ,@PREV_B := A.B
      FROM 
   (SELECT '1' ID, 'AA' A, 'F' B 
    UNION ALL
    SELECT '2' ID, 'A' A, 'F' B
    UNION ALL
    SELECT '3' ID, 'BB' A, 'G' B
    UNION ALL
    SELECT '4' ID, 'CC' A, 'H' B
    UNION ALL
    SELECT '5' ID, 'AA' A, 'F' B
   ) A,
   (SELECT @ROW_NUM := 1) B,
   (SELECT @PREV_B := '') C
  ORDER BY A.B , A.A DESC, A.ID
  ) D
WHERE RNUM = 1

-- 중복 값 모두 출력해야할 경우
SELECT * 
  FROM
  (
  SELECT  @ROW_NUM := IF(@PREV_B=A.B AND @PREV_A != A.A,@ROW_NUM+1,1) AS RNUM
         ,A.ID
         ,A.A
         ,A.B
         ,@PREV_B := A.B
         ,@PREV_A := A.A
    FROM 
   (SELECT '1' ID, 'AA' A, 'F' B 
    UNION ALL
    SELECT '2' ID, 'A' A, 'F' B
    UNION ALL
    SELECT '3' ID, 'BB' A, 'G' B
    UNION ALL
    SELECT '4' ID, 'CC' A, 'H' B
    UNION ALL
    SELECT '5' ID, 'AA' A, 'F' B
   ) A,
   (SELECT @ROW_NUM := 1) B,
   (SELECT @PREV_B := '') C
  ORDER BY A.B , A.A DESC
  ) D
WHERE RNUM = 1

 


by 잼따군 [2017.08.09 09:32:46]

아 rank를 저렇게 구현하면 되네요..;;

정말 감사합니다.(__)

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