밑의 표와같이 있다고 하면
| 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 가 나와야합니다
어떻게 할 수 있을까요?
원하는 결과값을 표로 알려주세요.
| idx | common_idx | name |
| 5 | 100 | tht |
| 4 | 200 | qqq |
입니다.
group by 를 하면 제일 첫번째 row를 반환하는데 그게아닌 group by 중 idx 가 제일 최신인거(idx가 클수록 최신)를 반환하고싶습니다
-- 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
-- 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
;
답변 감사드립니다 두분조언을 활용하여 해결했습니다!