2015-10-11 2 views
0

У меня есть таблицаPostgreSQL - значение MAX для каждого пользователя

User | Phone | Value 
Peter | 0 | 1 
Peter | 456 | 2 
Peter | 456 | 3 
Paul | 456 | 7 
Paul | 789 | 10 

Я хочу, чтобы выбрать MAX значение для каждого пользователя, чем это также ниже, чем tresshold

Для tresshold 8, я хочу привести к быть

Peter | 456 | 3 
Paul | 456 | 7 

Я попытался с GROUP BY HAVING, но я получаю

column "phone" must appear in the GROUP BY clause or be used in an aggregate function 

Подобная логика запросов работает в MySQL, но я не совсем уверен, как работать с GROUP BY в PostgreSQL. Я не хочу GROUP BY по телефону.

+1

Не использовать 'group by' является недопустимым SQL и будет отклонен любой другой СУБД. Он работает только в MySQL, потому что MySQL предпочитает возвращать случайные («неопределенные») результаты, а не отклонять неверные утверждения: http://www.mysqlperformanceblog.com/2006/09/06/wrong-group-by-makes-your -queries-fragile/ –

ответ

3

После того как я результаты решения «Юрген d», я придумал это, что дает мне те же результаты быстрее

SELECT DISTINCT ON(user) user, phone, value 
FROM table 
WHERE value < 8 
ORDER BY user, value DESC; 
+0

, вы должны принять это, поскольку это самое эффективное решение. – jangorecki

+0

Примечание. Возможно, это лучший результат, но это еще один проприетарный синтаксис, который не поддерживает другая СУБД. С другой стороны, стандартный SQL 'RANK' или' ROW_NUMBER' поддерживается почти всеми СУБД (помимо MySQL). – dnoeth

2
select t1.* 
from your_table t1 
join 
(
    select user, max(value) as max_value 
    from your_table 
    where value < 8 
    group by user 
) t2 on t1.user = t2.user and t1.value = t2.max_value 
1

В качестве альтернативы можно использовать ранговую функцию:

select * from 
(
select *, RANK() OVER (partition by [user] ORDER BY t.value desc) as value_rank from test_table as t 
where t.value < 8 
) as t1 
where value_rank = 1 
Смежные вопросы