Одиночный запрос для возврата строк, в которых поле имеет наибольшее число

У меня есть следующий запрос:

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, поэтому я хочу, чтобы он возвращал результаты операторов три и четыре.

Я думал сначала запросить наибольшее число, а затем сделать еще один запрос, чтобы включить синтаксис AND level=4.

Просто интересно, возможно ли это сделать как один SQL-запрос.


person John    schedule 28.03.2014    source источник
comment
Вы хотите, чтобы максимальное значение level за statement или общее максимальное значение level было условием. И самый высокий уровень до или после применения других условий в вашем запросе.   -  person Erwin Brandstetter    schedule 28.03.2014


Ответы (2)


Вы можете использовать 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
person Mureinik    schedule 28.03.2014

При этом в качестве условия используется overall наибольшее значение 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);

По сути, это упрощение ответа Клодоальдо. Выражение подзапроса просто прекрасно, так как оно возвращает одно значение.

В вашем примере фактически используется наибольшее значение level в результате в качестве условия. В Mureinik answer есть элегантное решение для этого.

В стороне: value — это зарезервированное слово в стандартном SQL. . Лучше не использовать идентификатор as, даже если это разрешено в Postgres.

person Erwin Brandstetter    schedule 28.03.2014