programing

사용자 정의 기준을 충족하는 각 그룹에서 레코드를 선택하는 MySQL 쿼리

nicescript 2022. 10. 20. 21:39
반응형

사용자 정의 기준을 충족하는 각 그룹에서 레코드를 선택하는 MySQL 쿼리

사용자 정의 기준을 충족하는 각 그룹에서 레코드를 선택하는 쿼리를 찾고 있습니다.다음 표로 설명할 수 있습니다.

CREATE TABLE sample_table
(
  id INT UNSIGNED AUTO_INCREMENT,
  categoryID INT,
  weight INT,

  PRIMARY KEY(id)  
);

INSERT INTO sample_table(categoryID, weight) VALUES(1, 3), (1, 5), (1, 2), (2, 5), (2, 3), (2, 9), (3, 5), (3, 3), (3, 3);

단순.GROUP BY categoryIDquery는 다음과 같이 각 그룹의 첫 번째 레코드를 반환합니다.

SELECT * FROM sample_table GROUP BY categoryID;
+----+------------+--------+
| id | categoryID | weight |
+----+------------+--------+
|  1 |          1 |      3 |
|  4 |          2 |      5 |
|  7 |          3 |      5 |
+----+------------+--------+

각 그룹의 마지막 레코드를 반환하려면 다음 방법을 사용합니다.

SELECT * FROM sample_table WHERE id IN (SELECT MAX(id) FROM sample_table GROUP BY categoryID);
+----+------------+--------+
| id | categoryID | weight |
+----+------------+--------+
|  3 |          1 |      2 |
|  6 |          2 |      9 |
|  9 |          3 |      3 |
+----+------------+--------+

그러나 내가 원하는 것은 가장 높은 값을 가진 레코드를 선택하는 것이다.weight각 그룹의 필드따라서 출력은 다음과 같습니다.

+----+------------+--------+
| id | categoryID | weight |
+----+------------+--------+
|  2 |          1 |      5 |
|  6 |          2 |      9 |
|  7 |          3 |      3 |
+----+------------+--------+

제안해 주십시오.GROUP BY categoryID위의 출력을 출력하는 쿼리.

MySQL 8+에서 이 작업을 수행하는 "현대식" 방법은ROW_NUMBER:

WITH cte AS (
    SELECT *, ROW_NUMBER() OVER (PARTITION BY categoryID ORDER BY weight DESC) rn
    FROM sample_table
)

SELECT id, categoryID, weight
FROM cte
WHERE rn = 1;

이전 버전에서는 가입 방식을 사용할 수 있습니다.

SELECT t1.id, t1.categoryID, t1.weight
FROM sample_table t1
INNER JOIN
(
    SELECT categoryID, MAX(weight) AS max_weight
    FROM sample_table
    GROUP BY categoryID
) t2
    ON t2.categoryID = t1.categoryID AND
       t2.max_weight = t1.weight;

저는 다음을 원합니다.

SELECT id, categoryID, weight
FROM sample_table ret
WHERE NOT EXISTS (
  SELECT *
  FROM sample_table witness
  WHERE witness.categoryID = ret.categoryID
    AND witness.weight > ret.weight
);

일반적으로 관련된 서브쿼리를 권장합니다.

select s.*
from sample_table s
where s.weight = (select max(s2.weight)
                  from sample_table s2
                  where s2.categoryID = s.categoryID
                 );

대부분의 데이터베이스에서는 퍼포먼스가 매우 우수하며 인덱스를 이용할 수 있습니다.sample_table(categoryId, weight).

언급URL : https://stackoverflow.com/questions/65192961/mysql-query-to-select-a-record-from-each-group-that-meets-a-user-defined-criteri

반응형