복붙노트

[SQL] SQL 쿼리는 열 값을 얻기 위해 다른 컬럼의 MAX 값과 일치?

SQL

SQL 쿼리는 열 값을 얻기 위해 다른 컬럼의 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. ==============================

    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. ==============================

    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. ==============================

    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;
    
  4. 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