itsource

각 유형에서 가장 큰 행 선택 방법

mycopycode 2022. 9. 12. 11:50
반응형

각 유형에서 가장 큰 행 선택 방법

PK("object", "type", "mid") 및 다음 구조를 가진 테이블이 있습니다.

+-----+----------+-------+---------+-----+
| type|  object  | value | preview | mid |
+-----+----------+-------+---------+-----+
| t1  | uid-0001 |   2   | p1      | 1   |
| t1  | uid-0002 |   10  | p2      | 1   |
| t2  | uid-0001 |   1   | p1      | 1   |
| t2  | uid-0003 |   5   | p3      | 1   |
| t3  | uid-0005 |   10  | p5      | 2   |
| t3  | uid-0001 |   40  | p1      | 2   |
| t4  | uid-0004 |   5   | p4      | 2   |
+-----+----------+-------+---------+-----+

제가 달성하고 싶은 결과는 다음과 같습니다.

+-----+----------+-------+---------+-----+
| type|  object  | value | preview | mid |
+-----+----------+-------+---------+-----+
| t1  | uid-0002 |   10  | p2      | 1   |
| t2  | uid-0003 |   5   | p3      | 1   |
| t3  | uid-0001 |   40  | p1      | 2   |
| t4  | uid-0004 |   5   | p4      | 2   |
+-----+----------+-------+---------+-----+

사용해 본 SQL은 다음과 같습니다.

SELECT * 
FROM table 
WHERE value in (SELECT max(value) FROM table GROUP BY type) 
GROUP BY type

그러나 테이블에서 동일한 값이 둘 이상일 경우 잘못된 값을 얻기 때문에 실패합니다.

나도 해봤어

SELECT * 
FROM (SELECT * FROM table ORDER BY value desc) x 
GROUP BY type;

같은 에러가 발생하고 있습니다.

잘못된 결과의 예:

+-----+----------+-------+---------+-----+
| type|  object  | value | preview | mid |
+-----+----------+-------+---------+-----+
| t1  | uid-0002 |   10  | p2      | 1   |
| t2  | uid-0003 |   5   | p3      | 1   |
| t3  | uid-0005 |   10  | p5      | 2   |
| t4  | uid-0004 |   5   | p4      | 2   |
+-----+----------+-------+---------+-----+

이 경우 행:t3그리고.t1동일한 값(10, t1에 대한 값이어야 함)을 사용하고 두 유형(t1, t3)에서 모두 선택.

각 유형의 유형 및 최대값만 포함하는 테이블을 만든 다음 이 테이블을 필터로 사용하여 최대값을 가진 레코드만 볼 수 있습니다.

SELECT *
FROM table t
JOIN (
    SELECT
        type
        ,MAX(value) as max_value
    FROM table
    ) m on t.type = m.type and t.value = m.max_value

첫 번째 시도는 매우 근접합니다.서브쿼리에 where 구를 추가하여 외부 쿼리에 링크하면 됩니다.GROUP BY다음은 원하는 결과를 얻을 수 있습니다.

SELECT t.Type, t.Object, t.Value, t.Preview 
FROM Table AS t
WHERE value IN (SELECT max(value) FROM Table AS t2 WHERE t2.Type = t.Type) 
ORDER BY t.Type;

SQL Fidle의 예

최신 버전의 MySQL(8.0)을 사용하고 있는 경우는, 다음의 것도 사용할 수 있습니다.

SELECT t.Type, t.Object, t.Value, t.Preview
FROM ( SELECT *, ROW_NUMBER() OVER(PARTITION BY Type ORDER BY Value DESC) AS rowNumber
      FROM Table) AS t
WHERE t.RowNumber = 1
ORDER BY t.Type;

DB의 예<>Fiddle

최적의 솔루션에 대해 다음 쿼리를 사용하여 "값" 열의 데이터 유형을 "번호"로 지정할 수 있습니다.

 SELECT * FROM table WHERE (type,VALUE) IN (SELECT type,MAX(value) FROM table GROUP BY type) 

언급URL : https://stackoverflow.com/questions/62539954/how-select-greatest-rows-in-each-types

반응형