반응형
각 유형에서 가장 큰 행 선택 방법
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;
최신 버전의 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;
최적의 솔루션에 대해 다음 쿼리를 사용하여 "값" 열의 데이터 유형을 "번호"로 지정할 수 있습니다.
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
반응형
'itsource' 카테고리의 다른 글
PHP는 Python의 목록 이해 구문과 동등합니까? (0) | 2022.09.12 |
---|---|
배열에서 선택한 모든 확인란 가져오기 (0) | 2022.09.12 |
원칙 2에서 엔티티를 다른 행으로 다시 저장하는 방법 (0) | 2022.09.12 |
지난달 날짜를 php로 가져오는 중 (0) | 2022.09.12 |
SQL select return 값을 바꾸는 방법 (0) | 2022.09.12 |