跨字段选择最小值和最大值并按用户聚合
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 + NULL
是 NULL
总是让我很恼火,但是包含相同值的一组行中的 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)
【讨论】:
以上是关于跨字段选择最小值和最大值并按用户聚合的主要内容,如果未能解决你的问题,请参考以下文章