[SQL] SQL 쿼리는 열 값을 얻기 위해 다른 컬럼의 MAX 값과 일치?
SQLSQL 쿼리는 열 값을 얻기 위해 다른 컬럼의 MAX 값과 일치?
좋아, 이건 내 쿼리는 다음과 같습니다
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
해결법
-
==============================
1.나는 이런 식으로 뭔가를 시도 할 것입니다 :
나는 이런 식으로 뭔가를 시도 할 것입니다 :
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
이는 매우 빠르게 자신의 솔루션이다
-
==============================
2.여기 파티에 늦었어요,하지만 난 그냥 내가 몇 년 동안 사용했습니다하는 방법에 대한 블로그 게시물을 게시, 나는 내가 세계와이를 공유하고자합니다.
여기 파티에 늦었어요,하지만 난 그냥 내가 몇 년 동안 사용했습니다하는 방법에 대한 블로그 게시물을 게시, 나는 내가 세계와이를 공유하고자합니다.
나는 방법 스칼라 집계 비교 전화, 그리고 더, 아니 하위 쿼리를 조인을 필요로하지 않는다 없으며 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
스칼라 및 집계 함수의 조합은 다음을 수행합니다
당신이 CHAR가 아닌 다른 유형의 값을 검색하려면, 출력, 예를 들어,에 추가 CAST를 PERFORMA해야 할 수도 있습니다 당신이 원하는 경우 VIDEO_DATE은 DATETIME 될 수 있습니다 :
CAST (SUBSTRING (MAX (CONCAT (LPAD (VIDEO_ID, 11, 0), VIDEO_DATE)), 12) AS DATETIME)
자기 접합 방법을 통해이 방법의 또 다른 장점은 다른 집계 데이터 (뿐만 아니라 최신 값)를 결합, 또는 동일한 쿼리, 예에서 첫 번째와 마지막 항목을 결합 할 수 있다는 것입니다
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
기타 이전 방법 대이 방법의 장점을 설명하는 자세한 사항은 내 전체 블로그 게시물은 여기에 있습니다 : https://www.stevenmoseley.com/high-performance-correlated-aggregate-sql-queries-without-ctes
-
==============================
3.여기서 더 일반적인 해결책이 (핸들 중복)
여기서 더 일반적인 해결책이 (핸들 중복)
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;
from https://stackoverflow.com/questions/6807854/sql-query-to-get-column-values-that-correspond-with-max-value-of-another-column by cc-by-sa and MIT license
'SQL' 카테고리의 다른 글
[SQL] DATETIME에 INT 변환 (SQL) (0) | 2020.05.20 |
---|---|
[SQL] ERROR 1115 (42000) : 알 수없는 문자 집합 : 'utf8mb4' (0) | 2020.05.20 |
[SQL] 오라클 : '= ANY ()'대 'IN ()' (0) | 2020.05.20 |
[SQL] PostgreSQL의 테이블은 존재하지만 가져올 때 쿼리 "관계가 존재하지 않습니다" (0) | 2020.05.20 |
[SQL] 필터 테이블 왼쪽 가입 적용하기 전에 (0) | 2020.05.20 |