Использование MAX () в качестве условия - PullRequest
0 голосов
/ 01 декабря 2011

Хотел узнать, смогу ли я сделать это без подзапроса

SELECT *
FROM tbl_name
WHERE id = 123456
AND attempts = (
    SELECT MAX(attempts)
    FROM tbl_name
    WHERE id = 123456
)

Желая сделать что-то подобное

SELECT *
FROM tbl_name
WHERE id = 123456
AND attempts = MAX(attempts)

Я получаю это, когда пытаюсь:

ERROR:  aggregates not allowed

Ответы [ 4 ]

4 голосов
/ 01 декабря 2011

Вы можете сделать это, используя функции управления окнами

select  *
from    tbl_name
WHERE   id = 123456
        and 1 = row_number() over (partition by id order by attempts desc)
3 голосов
/ 01 декабря 2011

Короткий ответ - нет, вы не можете смешивать агрегированные и неагрегированные значения

1 голос
/ 01 декабря 2011

То есть не возможно, поскольку условия в предложении WHERE применяются к каждой строке индивидуально, тогда как MAX относится к агрегированному значению, т. Е. Агрегации данных из одной или нескольких строк..

0 голосов
/ 01 декабря 2011

Вы можете достичь этого с помощью группы:

SELECT A.ID, MAX(A.Attempts)
FROM Table_Name AS A
WHERE A.ID = 123456
GROUP BY A.ID

Или, возможно, немного по-другому:

SELECT A.ID, MAX(A.Attempts)
FROM Table_Name AS A
GROUP BY A.ID
HAVING A.ID = 123456
...