다른 열의 MAX 값에 해당하는 열 값을 가져오기 위한 SQL 쿼리입니까?
좋아요, 이게 제 질문입니다.
SELECT
video_category,
video_url,
video_date,
video_title,
short_description,
MAX(video_id)
FROM
videos
GROUP BY
video_category
데이터를 풀하면 video_id에 대한 올바른 행을 얻을 수 있지만 다른 항목에 대해서는 각 카테고리의 첫 번째 행을 풀합니다.따라서 카테고리 1의 video_id에 대해 최대 결과를 얻으면 최대 ID를 얻지만 URL, 날짜, 제목 및 설명에 대해서는 테이블의 첫 번째 행이 표시됩니다.
최대 ID 결과에 해당하는 다른 열을 어떻게 풀링할 수 있습니까?
편집: 고정.
SELECT
*
FROM
videos
WHERE
video_id IN
(
SELECT
DISTINCT
MAX(video_id)
FROM
videos
GROUP BY
video_category
)
ORDER BY
video_category ASC
저는 이런 걸 해보고 싶어요
SELECT
s.video_id
,s.video_category
,s.video_url
,s.video_date
,s.video_title
,short_description
FROM videos s
JOIN (SELECT MAX(video_id) AS id FROM videos GROUP BY video_category) max
ON s.video_id = max.id
당신의 솔루션보다 훨씬 더 빠릅니다.
최근 MySQL에서 이러한 문제를 해결하기 위한 새로운 기술을 발표했습니다.
스칼라 집약 삭감
스칼라 Aggregate Reduction은 가입이나 서브쿼리, CTE가 필요 없기 때문에 이를 실현하기 위한 가장 뛰어난 퍼포먼스 및 간단한 방법입니다(DB 엔진 용어).
질문의 경우 다음과 같습니다.
SELECT
video_category,
MAX(video_id) AS video_id,
SUBSTRING(MAX(CONCAT(LPAD(video_id, 11, '0'), video_url)), 12) AS video_url,
SUBSTRING(MAX(CONCAT(LPAD(video_id, 11, '0'), video_date)), 12) AS video_date,
SUBSTRING(MAX(CONCAT(LPAD(video_id, 11, '0'), video_title)), 12) AS video_title,
SUBSTRING(MAX(CONCAT(LPAD(video_id, 11, '0'), short_description)), 12) AS short_description
FROM
videos
GROUP BY
video_category
스칼라 함수와 집약 함수의 조합은 다음과 같습니다.
- LPAD는 적절한 문자열 비교를 가능하게 하기 위해 집약 내 상관 식별자를 나타냅니다(예를 들어 "0009"와 "0025"는 적절한 순위가 매겨집니다).INT 프라이머리 키를 가정하여 11글자에 LPADDING을 입력했습니다.BIGINT를 사용하는 경우 테이블의 일반성을 지원하기 위해 이 값을 늘릴 수 있습니다.DATETIME 필드(고정 길이)에서 비교하는 경우 패딩은 필요하지 않습니다.
- CONCAT는 출력 열과 함께 패딩된 식별자를 나타냅니다(따라서 "0000000000009myvalue" vs "0000000025othervalue").
- 집약 세트를 최대화하면 "00000000025othervalue"가 승자가 됩니다.
- SUBSTRING 결과는 비교된 식별자 부분을 잘라내고 값만 남습니다.
CHAR 이외의 타입의 값을 취득하는 경우는, 출력에 CAST 를 추가할 필요가 있습니다(예:video_date
DATETIME이 되려면:
CAST(SUBSTRING(MAX(CONCAT(LPAD(video_id, 11, '0'), video_date)), 12) AS DATETIME)
이 방법의 또 다른 장점은 최신 값뿐만 아니라 다른 집계 데이터를 결합하거나 동일한 쿼리에서 첫 번째 AND 항목과 마지막 항목을 결합할 수 있다는 것입니다.
SELECT
-- Overall totals
video_category,
COUNT(1) AS videos_in_category,
DATEDIFF(MAX(video_date), MIN(video_date)) AS timespan,
-- Last video details
MAX(video_id) AS last_video_id,
SUBSTRING(MAX(CONCAT(LPAD(video_id, 11, '0'), video_url)), 12) AS last_video_url,
...
-- First video details
MIN(video_id) AS first_video_id,
SUBSTRING(MIN(CONCAT(LPAD(video_id, 11, '0'), video_url)), 12) AS first_video_url,
...
-- And so on
이 방법의 이점에 대한 자세한 내용은 다음 URL에서 확인할 수 있습니다.https://www.stevenmoseley.com/blog/tech/high-performance-sql-correlated-scalar-aggregate-reduction-queries
보다 일반적인 솔루션(복제 처리)을 다음에 나타냅니다.
CREATE TABLE test(
i INTEGER,
c INTEGER,
v INTEGER
);
insert into test(i, c, v)
values
(3, 1, 1),
(3, 2, 2),
(3, 3, 3),
(4, 2, 4),
(4, 3, 5),
(4, 4, 6),
(5, 3, 7),
(5, 4, 8),
(5, 5, 9),
(6, 4, 10),
(6, 5, 11),
(6, 6, 12);
SELECT t.c, t.v
FROM test t
JOIN (SELECT test.c, max(i) as mi FROM test GROUP BY c) j ON
t.i = j.mi AND
t.c = j.c
ORDER BY c;
조금 더 '고급스러운' 솔루션이지만, 동일한 작업을 수행해야 합니다.
SELECT
video_category,
video_url,
video_date,
video_title,
short_description,
video_id
FROM
videos
ORDER BY video_id DESC
LIMIT 1;
즉, 원하는 열을 모두 포함하는 표를 만들고 최대값이 맨 위에 오도록 정렬한 다음 한 행만 반환하도록 잘라냅니다.
video_category, video_url, video_date, video_description, video_id from video t1에서 video_id를 선택합니다(SELECT max(video_id) FROM video t2 WHERE t1.video_category=t2).
올바르게 이해하고 테스트할 수 있도록 입력 및 출력 기록을 제공하십시오.
언급URL : https://stackoverflow.com/questions/6807854/sql-query-to-get-column-values-that-correspond-with-max-value-of-another-column
'programing' 카테고리의 다른 글
CamelCase를 snake_case로 변환하는 우아한 Python 함수? (0) | 2022.10.27 |
---|---|
Vuex에서 매개 변수화된 getter - 트리거 udpate (0) | 2022.10.27 |
'System' 유형의 COM 개체를 캐스팅할 수 없습니다.__ComObject'에서 인터페이스 유형으로 (0) | 2022.10.27 |
MariaDb 마스터 슬레이브(페일오버 포함) (0) | 2022.10.27 |
모든 JavaScript 프로그래머가 알아야 할 것은 무엇입니까? (0) | 2022.10.27 |