ВЫБЕРИТЕ 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

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


person Itai Sagi    schedule 30.01.2014    source источник
comment
Меня всегда раздражало, что 1 + 2 + 3 + NULL равно NULL, а sum() набора строк, содержащих одинаковые значения, равно 6.   -  person Craig Ringer    schedule 30.01.2014


Ответы (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)
person dnoeth    schedule 30.01.2014