Sql 为其他两列中的每个值从列中选择“最大值”

Sql 为其他两列中的每个值从列中选择“最大值”,sql,postgresql,Sql,Postgresql,我正在开发一个追踪电视节目的网络应用程序,我需要获得所有季末剧集id,这意味着,所有电视节目的季末剧集数都是最高的 这是我的“剧集”表的简化版本 预期输出: id ---| 3 | 5 | 9 | 11 | 我在最近的一个赛季中成功地做到了这一点,但我不能让它在所有的赛季都有效 我也试着从中吸取一些想法,但我似乎找不到一种方法来添加电视节目id 我使用的是Postgres v10您可以使用下面的SQL来获得结果,使用GROUP BY with sub QUERY as: se

我正在开发一个追踪电视节目的网络应用程序,我需要获得所有季末剧集id,这意味着,所有电视节目的季末剧集数都是最高的

这是我的“剧集”表的简化版本

预期输出:

 id
 ---|
 3  |
 5  |
 9  |
11  |
我在最近的一个赛季中成功地做到了这一点,但我不能让它在所有的赛季都有效

我也试着从中吸取一些想法,但我似乎找不到一种方法来添加电视节目id


我使用的是Postgres v10

您可以使用下面的SQL来获得结果,使用GROUP BY with sub QUERY as:

select id from tab_x
where (tvshow_id,season,epnum) in (
select tvshow_id,season,max(epnum)
from tab_x
group by tvshow_id,season)

您可以使用以下SQL获得结果,使用GROUP BY with sub QUERY as:

select id from tab_x
where (tvshow_id,season,epnum) in (
select tvshow_id,season,max(epnum)
from tab_x
group by tvshow_id,season)

下面是获得所需结果的简单查询。通过使用distinct on()子句,下面的查询在性能上也很好

select distinct on (tvshow_id,season) id from your_table order by tvshow_id,season ,epnum desc 选择 独特的电视节目(电视节目编号,季节) 身份证件 从你的桌子上 按tvshow_id、季节、epnum desc订购
下面是获得所需结果的简单查询。通过使用distinct on()子句,下面的查询在性能上也很好

select distinct on (tvshow_id,season) id from your_table order by tvshow_id,season ,epnum desc 选择 独特的电视节目(电视节目编号,季节) 身份证件 从你的桌子上 按tvshow_id、季节、epnum desc订购
在哪个数据库中?在问题的最后:“我正在使用Postgres v10”如果你说你已经有部分工作了,最好看看你的源代码。修复一个小错误要比重新编写更容易。我认为它不会有用,因为它仅限于最新一季,而且电视节目id是硬编码的,所以正确的答案不太可能使用这些。。但现在你进入了哪个数据库?问题的最后是:“我在使用Postgres v10”。如果你说你已经有了部分工作,最好看看你的源代码。修复一个小错误要比重新编写更容易。我认为它不会有用,因为它仅限于最新一季,而且电视节目id是硬编码的,所以正确的答案不太可能使用这些。。但是,这与@Vivek在性能方面的回答有什么关系呢?我得到了相同的结果(输出和操作时间),并且我使用的测试表非常小(约150行),所以我不知道。@nip我不确定PostgreS,但在我使用的大多数数据库中,窗口函数通常都非常有效。此外,它还可以使事情固定下来。而且,
其中x在(1,2,3)
中几乎是
其中x=1或x=2或x=3
。对于较大的列表,这可能会变得非常缓慢。@Shawn好吧,现在我很担心,因为这个表将变得有点大,我添加了另一个WHERE IN来过滤电视节目id,因为我只想从一定数量的电视节目中获得本季的大结局。如果不使用WHERE IN,这个答案(过滤)将如何工作?这可能吗?@nip我会使用
行数()
方法。使用Ajay Gupta的答案。这与@Vivek在绩效方面的回答有什么关系?我得到了相同的结果(输出和操作时间),并且我使用的测试表非常小(约150行),所以我不知道。@nip我不确定PostgreS,但在我使用的大多数数据库中,窗口函数通常都非常有效。此外,它还可以使事情固定下来。而且,
其中x在(1,2,3)
中几乎是
其中x=1或x=2或x=3
。对于较大的列表,这可能会变得非常缓慢。@Shawn好吧,现在我很担心,因为这个表将变得有点大,我添加了另一个WHERE IN来过滤电视节目id,因为我只想从一定数量的电视节目中获得本季的大结局。如果不使用WHERE IN,这个答案(过滤)将如何工作?这可能吗?@nip我会使用
行数()
方法。使用Ajay Gupta的答案。