2013-02-10 40 views
0

我有這些列的表:GROUP BY和最大的兩列

id | series_id | season_id | episode_id | title | type ... 

我想獲得具有獨特series_id其中season_idepisode_id是最大行數。

+3

請顯示您的嘗試。 – 2013-02-10 09:26:06

+3

你正在使用什麼RDBMS? – 2013-02-10 09:26:17

+0

你可能想看看'HAVING' – Najzero 2013-02-10 09:26:54

回答

1

一種解決方案是要做到這一點:

SELECT t1.* 
FROM YourTable AS t1 
INNER JOIN 
(
    SELECT 
    series_id, 
    MAX(season_id) AS MAxSeasonId, 
    MAX(Episode_id) AS MAXEpisodeID 
    FROM yourTable 
    GROUP BY series_id 
) AS t2 ON t1.series_id = t2.series_id 
     AND t1.season_id = t2.MaxSeasonId 
     AND t1.episode_id = t2.MaxEpisode_id; 
0
SELECT * 
FROM TableName t1 
WHERE EXISTS (
       SELECT 1 
       FROM t2 
       WHERE t1.series_id = t2.series_id 
       HAVING MAX(t2.season_id) = t1.season_id 
       AND MAX(t2.episode_id) = t1.episode_id 
      ) 
0

試試這個..

SELECT * FROM TABLE 
HAVING MAX(season_id) AND MAX(episode_id) 
GROUP BY series_id 

:)

0

我想這可能是矯枉過正,但它是唯一我發現這種方式對我很有用。

DECLARE @SeriesInfo TABLE 
(
    id   INT, 
    series_id INT, 
    season_id INT, 
    episode_id INT, 
    title  VARCHAR(50), 
    type  CHAR(1) 
); 
INSERT INTO @SeriesInfo VALUES (1, 1, 1, 1, 'Series 1 Season 1 Episode 1', 'A'), 
           (2, 1, 1, 2, 'Series 1 Season 1 Episode 2', 'A'), 
           (3, 1, 1, 3, 'Series 1 Season 1 Episode 3', 'A'), 
           (4, 1, 2, 1, 'Series 1 Season 2 Episode 1', 'A'), 
           (5, 1, 2, 2, 'Series 1 Season 2 Episode 2', 'A'), 
           (6, 2, 1, 1, 'Series 2 Season 1 Episode 1', 'A'), 
           (7, 2, 1, 2, 'Series 2 Season 1 Episode 2', 'A'), 
           (8, 2, 1, 3, 'Series 2 Season 1 Episode 3', 'A'), 
           (9, 2, 1, 4, 'Series 2 Season 1 Episode 4', 'A'), 
           (10, 2, 2, 1, 'Series 2 Season 2 Episode 1', 'A'), 
           (11, 2, 2, 2, 'Series 2 Season 2 Episode 2', 'A'), 
           (12, 2, 2, 3, 'Series 2 Season 2 Episode 3', 'A'); 
SELECT id, 
     series_id, 
     season_id, 
     episode_id, 
     title, 
     type 
FROM (
     SELECT ROW_NUMBER() OVER(PARTITION BY series_id ORDER BY season_id DESC, episode_id DESC) RowNum, 
       * 
     FROM @SeriesInfo 
     ) X 
WHERE X.RowNum = 1; 

--SELECT ROW_NUMBER() OVER(PARTITION BY series_id ORDER BY season_id DESC, episode_id DESC) RowNum, * FROM @SeriesInfo; 

(對不起,樣本數據的滿豐)

的一點是,如果我們只取series_id和season_id的最大值,我們不會得到任何一系列有效的對。在這兩種情況下,第1季比第2季都多。 ROW_NUMBER()子句將每行返回一個唯一的數字,但由於「PARTITION BY」,它會爲每個series_id重新啓動(請參閱註釋掉的行) 。如果我們僅返回ROW_NUMBER爲1的行,則我們將爲每個series_id獲取一行,並且它將是max season_id中具有max episode_id的那一行。