如何控制GROUP BY留下哪一行?

时间:2015-07-11 08:51:16

标签: sql

我有两张桌子。

tv_shows

id    |    title
-------------------------
1        The X-Files
2        Mr. Robot

tv_show_id    |    title        |    epoch_airtime
----------------------------------------------------
1                My Struggle        15249204282
1                Via Negativa       11023920382
1                Requiem            10292092022
2                Finale             15020392031

预期输出

tv_shows.title    |    episodes.title    |    episodes.epoch_airtime
---------------------------------------------------------------------
The X-Files            My Struggle            15249204282
Mr. Robot              Finale                 15020392031

我希望我的查询能够返回每个节目的下一个无节奏的剧集,以及它的播放时间和节目的标题。因此,结果集中只应包含一个X-Files剧集,并且应该是下一个播出的剧集。

我现在的查询是:

SELECT episodes.title, episodes.airtime, tv_shows.title
FROM episodes 
JOIN tv_shows on episodes.tv_show_id = tv_shows.id
WHERE episodes.airtime > <CURRENT_EPOCH_TIME>
GROUP BY tv_shows.title;

<CURRENT_EPOCH_TIME>位只是这篇文章的占位符,我将使用参数化查询和我程序中的当前纪元时间,忽略它。

这会返回每个节目的一集,但它是将来最远的一集 - 或数据库中的最后一集 - 当我想要相反时。 ORDER BY语句似乎是在调整结果集的顺序,但不会选择哪些结果。这个让我有些不耐烦,Google和我在桌子上的参考书并没有帮助。如果有人能解释这类问题的解决方案是什么,我会喜欢它。

1 个答案:

答案 0 :(得分:0)

在Oracle / SQL Server中,不确定SQLite

    SELECT SHOWTITLE ,EPSTITLE ,AIRTIME FROM 
(select tv_shows.title ShowTitle
        ,episodes.title EpsTitle
        ,episodes.epoch_airtime AirTime
        , RANK() OVER(PARTITION BY episodes.tv_shows_id order by episodes.epoch_airtime DESC) RNK
    from tv_shows inner join 
        episodes on episodes.tv_shows_id=tv_shows.id) T
WHERE RNK=1;