조건 1.
그룹별로 image 컬럼에 데이터가 들어있는 사람중 idx 가 가장 높은 1명만 그룹의 제일 상단에 출력
조건 2.
위의 조건1에 해당하지 않는그룹원은 idx 역순
조건 3.
각 그룹별 3명만 출력
# 그룹의 순서까지 정렬할 필요는 없습니다.
원하는 output
고수님의 가르침을 부탁드립니다.
CREATE TABLE test1 AS SELECT 1 idx, 1 grp, '김태희' name, NULL image UNION ALL SELECT 2, 1, '송혜교', NULL UNION ALL SELECT 3, 1, '전지현', 'jihyun.jpg' UNION ALL SELECT 4, 2, '한예슬', NULL UNION ALL SELECT 5, 2, '아이유', 'iu.jpg' UNION ALL SELECT 6, 2, '이민정', 'minjung.jpg' UNION ALL SELECT 7, 2, '수지' , 'suzi.jpg' UNION ALL SELECT 8, 3, '태연' , NULL UNION ALL SELECT 9, 3, '윤아' , 'yoona.jpg' UNION ALL SELECT 10, 3, '유인나', NULL UNION ALL SELECT 11, 3, '박보영', NULL UNION ALL SELECT 12, 4, '신세경', 'kain.jpg' UNION ALL SELECT 13, 4, '한가인', NULL UNION ALL SELECT 14, 4, '김사랑', 'sarang.jpg' ;
SELECT a.idx, a.grp, a.name, a.image FROM (SELECT a.idx, a.grp, a.name, a.image , @rn := CASE WHEN @grp = a.grp THEN @rn + 1 ELSE 1 END rn , @grp := a.grp FROM (SELECT a.idx, a.grp, a.name, a.image FROM test1 a LEFT OUTER JOIN (SELECT grp, MAX(idx) idx FROM test1 WHERE image IS NOT NULL GROUP BY grp ) b ON a.idx = b.idx ORDER BY a.grp , CASE WHEN b.idx IS NOT NULL THEN 1 ELSE 2 END , a.idx DESC ) a ) a WHERE rn <= 3 ;