单个查询返回字段编号最大的行

时间:2014-03-28 16:03:42

标签: sql postgresql greatest-n-per-group window-functions

我有以下查询:

SELECT statement, value, level 
FROM records 
WHERE user_id=10 AND value IS NOT NULL and disabled IS NULL

它返回结果,如下例所示:

statement one   | 1   | 3
statement two   | 1   | 3
statement three | 0.5 | 4
statement four  | 0.5 | 4

最后一个值是级别字段中的值,我想只选择最高数值的结果。所以在这种情况下,最高的数字是4,所以我希望它返回语句3和4结果。

我想首先查询最高的数字,然后再进行另一个查询以包含AND level=4语法。

只是想知道它是否可以作为单个SQL查询来执行。

3 个答案:

答案 0 :(得分:1)

with max_level as (
    select max(level) as max_level
    from records
)
select statement, "value", level 
from records 
where
    user_id = 10 and
    "value" is not null and
    disabled is null and
    level = (select max_level from max_level)

答案 1 :(得分:1)

您可以使用rank()查找最高level

SELECT statement, value, level
FROM   (SELECT statement, value, level, RANK() OVER (ORDER BY level DESC) AS rk
        FROM   records 
        WHERE  user_id = 10 AND value IS NOT NULL AND disabled IS NULL)
WHERE  rk = 1

答案 2 :(得分:0)

这使用overall的{​​strong> level最高值作为条件。

SELECT statement, "value", level 
FROM   records
WHERE  user_id = 10
AND    "value" IS NOT NULL
AND    disabled IS NULL
AND    level = (SELECT max(level) FROM records);

这基本上是Clodoaldo's answer的简化。子查询表达式很好,因为它返回单个值。

您的示例实际上使用结果中最高值level作为条件。 Mureinik's answer有一个优雅的解决方案。

除此之外:valuereserved word in standard SQL。最好不要使用as标识符,即使在Postgres中允许使用。