web-dev-qa-db-ja.com

1つの列のMAX値に対応する他の列を取得しますか?

OK、これは私のクエリです:

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
44
Devin

私はこのようなことを試してみます:

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

独自のソリューションよりもかなり高速です

39
Dalen

より一般的なソリューションを次に示します(重複を処理します)

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;
0