我有一个表“ the_table”,其中包含三个字段:“ id”(主键),“ a”和“ b”。我需要为每个“ a”选择其中“ b”具有该“ a”最大值的行。然后我运行查询:
select x.a, x.id
from the_table x
where b = ( select max( b ) where a = x.a )
此查询挂起我的PostgreSQL服务器。
我尝试了另一个查询:
select x.a, max( x.id )
from the_table x
where b = ( select max( b ) where a = x.a )
group by x.a
但是结果是一样的。
这些查询出了什么问题?
感谢您的回复!
答案 0 :(得分:1)
如果您只想为“ a”中的每个值查看一个记录,则 Postgres为此具有了出色的DISTINCT ON子句。
select distinct on (a) id, a, b
from the_table t
order by a, b desc, id
顺序很重要-首先转到“ distinct on”子句中的列的列表-在您的情况下只是“ a”列,然后按希望查看数据的顺序进行排序-在您的情况下,要查看max b所以“ b desc”
如果要返回所有记录,其中“ a”为“ b = max(b)”,则
select id, a, b
from (select id, a, b, rank() over(partition by a order by b desc) rnk
from the_table) a
where rnk=1
一个很好的技巧-永远不要在WHERE语句中使用嵌套的SELECTS。 如果DB的记录多而不多,那么您会等待很长时间才能看到结果,即使没有更糟的情况。
答案 1 :(得分:0)
您的子查询中将需要一个from子句。
select x.a, x.id
from the_table x
where b = (select max( b ) from the_table x where a = x.a )
答案 2 :(得分:0)
我怀疑alias
(当然还有from
子句)的问题:
select x.*
from the_table x
where x.b = ( select max(x1.b) from the_table x1 where x1.a = x.a );
当然,如果只需要最大id
而不是其他信息,请使用group by
子句: