跨字段选择MIN和MAX并按用户聚合

时间:2014-01-30 08:28:52

标签: sql postgresql aggregate-functions rails-postgresql

我在db

中保存了以下原始数据
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的最小值和最大值,其中null应该优先于实际的最大值, 关于如何通过sql实现这一点的任何想法?

1 个答案:

答案 0 :(得分:1)

您可以使用COUT(*)与COUNT(列)检查该列中是否存在NULL:

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)