2014-01-30 3 views
1

Я следующие исходные данные сохраняются в БДSELECT MIN и MAX по полям и агрегату пользователя

id min_price, max_price, min_x, max_x, user_id 
------------------------------------------- 
1 50  200  5  null  1 
2 0   100  0  3  1 
3 150  300  0  null  1 
4 20  200  2  5  2 
5 50  200  0  5  2 
6 150  200  1  3  2 

Я хочу, чтобы создать SQL-запрос (Postgres) со следующими данными:

min_price, max_price, min_x, max_x, user_id 
    0   300  0  null 1 
    20  200  0  5  2 

, так что в принципе я бы получил min и max для каждого user_id для полей различий, где null должен иметь приоритет над фактическим максимальным значением, любая идея о том, как достичь этого через sql?

+0

Это всегда меня раздражало, что '1 + 2 + 3 + NULL' является' NULL', но 'sum()' из набора строк, содержащих одни и те же значения, равно '6'. –

ответ

1

Вы можете проверить, если NULL существует в этом столбце, используя COUT (*) по сравнению с COUNT (колонка):

SELECT 
    user_id, 
    CASE WHEN COUNT(*) <> COUNT(max_x) THEN NULL ELSE MAX(max_x) END AS max_x 
FROM vt 
GROUP BY 1 

скотина решение сила будет:

NULLIF(MAX(COALESCE(max_x, 9999999999)), 9999999999)