简单查询挂起PostgreSQL

时间:2018-08-21 12:59:09

标签: sql postgresql

我有一个表“ 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

但是结果是一样的。

这些查询出了什么问题?

感谢您的回复!

3 个答案:

答案 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子句: