繁体   English   中英

在两列上按最大和最大分组

[英]group by and max on two columns

我有一个包含这些列的表:

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

我想获得具有唯一series_id行,其中season_idepisode_id为最大值。

一种解决方案是这样做:

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

尝试这个..

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

:)

我认为这可能是过大了,但这是我发现对我有用的唯一方法。

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将获得一行,并且它将是最大season_id中具有最大Episode_id的行。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM