그룹바이 이용한 조건절인데..이거 분명 간단히 해결 가능할 거같은데 잘안되네요.ㅠㅠ 0 4 542

by 르질라 [MySQL] [2021.11.27 08:35:33]


mallNo  |   adminNo    | type
0          |       10       |   A
1          |       90       |   A
2          |       10       |   B

2          |       10       |   C

type 이  A로 그룹핑해서 mallNo 가 큰거에 대한 데이터를 노출시키고싶거든요. (2번째 행이 되겠죠)
type 이 A 인거에 대한 mallno 가 0, 1 두개가있는데 1이 더 크니 adminNO가 90인거만 노출시키고싶어요. 이 조건이 중요합니다.

mallNo  |   adminNo    | type
1          |       90       |   A
2          |       10       |   B

2          |       10       |   C

이런식으로요.
이거 쉽게 해결될거같은데 잘안되네요.ㅠㅠ
고수님들 부탁드립니다!

by pajama [2021.11.27 15:47:33]

위 데이터는 아래 쿼리로 가능합니다. 지원 가능한 mysql 버전이라면 row_number 함수를 사용하셔도 되겠네요.

select * from t
where mailno in (select max(mailno) from t group by type);


by 르질라 [2021.11.28 11:05:48]

아 답변감사합니다.ㅠㅠ.

하지만 본문예시를 살짝수정했는데요.mallNo가 중복되는값이라 알려주신대로 하면 원하는결과가 나오진 않습니다.ㅠㅠ


by pajama [2021.11.28 20:13:23]

셀프 조인이나 mysql 버전이 8.0이시면 row_number 함수를 써보시죠~

 

select mailno, adminno, type
FROM
(
SELECT t1.mailno, t1.adminno, t1.type, count(*) as rn 
FROM test as t1, test as t2
WHERE t1.type =  t2.type and
      t1.mailno <= t2.mailno
GROUP BY  t1.mailno, t1.adminno, t1.type
) as t
where rn = 1

select mailno, adminno, type
FROM
(
SELECT mailno, adminno, type, row_number() over (partition by type order by adminno desc) as rn 
FROM test 
) as t
where rn = 1


by 마농 [2021.11.29 08:15:24]
-- 분석함수
SELECT mallNo, adminNo, type
  FROM (SELECT mallNo, adminNo, type
             , ROW_NUMBER() OVER(PARTITION BY type ORDER BY mallNo DESC) rn
          FROM t
        ) a
 WHERE rn = 1
;

-- 집계결과와 조인
SELECT a.*
  FROM t a
 INNER JOIN
       (SELECT type
             , MAX(mallNo) mallNo
          FROM t
         GROUP BY type
        ) b
    ON a.type   = b.type
   AND a.mallNo = b.mallNo
;

-- IN
SELECT *
  FROM t
 WHERE (type, mallNo) IN (SELECT type
                               , MAX(mallNo) mallNo
                            FROM t
                           GROUP BY type
                          )
;

-- Not Exists
SELECT *
  FROM t a
 WHERE NOT EXISTS (SELECT 1
                     FROM t b
                    WHERE b.type   = a.type
                      AND b.mallNo > a.mallNo
                   )
;

-- 셀프 아우터 조인 후 Null 체크
SELECT a.*
  FROM t a
  LEFT OUTER JOIN t b
    ON a.type   = b.type
   AND a.mallNo < b.mallNo
 WHERE b.type  IS NULL
;

 

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