group by 했을 시 가장 최근 행 나오기 0 5 2,144

by 신제트 [MySQL] [2023.03.10 15:22:07]


 

밑의 표와같이 있다고 하면

idx common_idx name
1 100 asd
2 200 sdf
3 100 kkk
4 200 qqq
5 100 tht

common_idx 로 group by 했을때 제일 최신 데이터가 나오게 하고싶습니다

select * from t1 group by common_idx order by idx desc; 로 해보고있었습니다.

100은 idx=5 인 row

200은 idx=4 인 row 가 나와야합니다 

어떻게 할 수 있을까요?

 

by 우리집아찌 [2023.03.10 15:40:43]

원하는 결과값을 표로 알려주세요.


by 신제트 [2023.03.10 15:46:53]
idx common_idx name
5 100 tht
4 200 qqq

입니다. 

group by 를 하면 제일 첫번째 row를 반환하는데 그게아닌 group by 중 idx 가 제일 최신인거(idx가 클수록 최신)를 반환하고싶습니다


by 우리집아찌 [2023.03.10 16:05:55]
-- my sql이 row_number() over 함수를 지원한다면..

select * 
  from ( select t1.*
                    , row_number() over(partition by common_idx  order by idx desc ) rn
                from t1 )
 where rn = 1 

 


by 마농 [2023.03.13 08:34:53]
-- MySQL 8.0 이상 분석함수 지원 버전인 경우 --
SELECT idx, common_idx, name
  FROM (SELECT idx, common_idx, name
             , ROW_NUMBER() OVER(PARTITION BY common_idx ORDER BY idx DESC) rn
          FROM t1
        ) a
 WHERE rn = 1
;

-- MySQL 8.0 미만 --
SELECT a.*
  FROM t1 a
 INNER JOIN (SELECT MAX(idx) idx FROM t1 GROUP BY common_idx) b
    ON a.idx = b.idx
;

SELECT a.*
  FROM t1 a
  LEFT OUTER JOIN t1 b
    ON a.common_idx = b.common_idx
   AND a.idx < b.idx
 WHERE b.idx IS NULL
;

SELECT *
  FROM t1 a
 WHERE NOT EXISTS (SELECT 1 FROM t1 WHERE common_idx = a.common_idx AND idx > a.idx)
;

SELECT *
  FROM t1 a
 WHERE idx = (SELECT MAX(idx) FROM t1 WHERE common_idx = a.common_idx)
;

SELECT *
  FROM t1
 WHERE idx IN (SELECT MAX(idx) FROM t1 GROUP BY common_idx)
;

SELECT MAX(idx) idx
     , common_idx
     , SUBSTR(MAX(CONCAT(LPAD(idx, 10, 0), name)), 11, 30) name
  FROM t1
 GROUP BY common_idx
;

 


by 신제트 [2023.03.13 12:47:25]

답변 감사드립니다 두분조언을 활용하여 해결했습니다!

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