跨字段选择最小值和最大值并按用户聚合

Posted

技术标签:

【中文标题】跨字段选择最小值和最大值并按用户聚合【英文标题】:SELECT MIN and MAX across fields and aggregate by user 【发布时间】:2014-02-22 10:41:36 【问题描述】:

我在数据库中保存了以下原始数据

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 + 2 + 3 + NULLNULL 总是让我很恼火,但是包含相同值的一组行中的 sum()6 【参考方案1】:

您可以使用 COUT(*) 与 COUNT(column) 检查该列中是否存在 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)

【讨论】:

以上是关于跨字段选择最小值和最大值并按用户聚合的主要内容,如果未能解决你的问题,请参考以下文章

NumPy实现数据的聚合,计算最大值,最小值和其他值

查找熊猫索引数据帧的最小值和最大值

如何为 type='datetime-local' 的 Input 设置最小值和最大值?

MySQL的聚合函数

MySQL的聚合函数

第六期,聚合函数介绍!!!