postgresql - 如何在 postgresql 中对数据进行 minmax 规范化并构建为 json
问题描述
假设我有一个简单的表跟踪不同用户的值随着时间的推移作为 postgres 数据库,如下所示:
用户身份 | 日期 | 价值 |
---|---|---|
1 | '2021-01-01' | 1 |
1 | '2021-01-02' | 2 |
1 | '2021-01-03' | 3 |
2 | '2021-01-01' | 1 |
2 | '2021-01-02' | 2 |
2 | '2021-01-03' | 3 |
我想把这些数据作为一个json对象数组返回,所以我做了这样的事情......
select
user_id,
coalesce(
json_agg(
'date', date,
'value', value
),
'[]'
) as values
from user_table
group by user_id
但是,假设我还想返回另一列名为 json 对象的列,values_normalized
除了值在 0 和 1 之间标准化 minmax 之外,它是相同的。
我的假设是我可以做这样的事情 -
select
user_id,
coalesce(
json_agg(
'date', date,
'value', ((values - min(values) over ())::float / (max(values) over () - min(values) over ())::float)
),
'[]'
) as values
from user_table
group by user_id
但这给了我一个错误“聚合函数调用不能包含窗口函数调用”
有人知道怎么做吗?
解决方案
使用一个简单的子查询很容易:
SELECT user_id,
coalesce(
json_agg(
'date', date,
'value', (value - minvalue)::float /
(maxvalue - minvalue)::float
),
'[]'
) AS values
FROM (SELECT user_id, date, value
min(value) OVER () AS minvalue,
max(value) OVER () AS maxvalue,
FROM user_table) AS subq
GROUP BY user_id;
推荐阅读
- java - App Engine - LocalDatastoreService 加载 - 无法从后备存储加载
- android - 我想为用户登录提供面部 id 身份验证,这样用户就不必每次都输入 id 和密码
- node.js - 运行 npm run generate 时出现 Nuxt 致命错误
- javascript - 如果页面未完全加载并且我的 webdriver 所需的等待时间已经结束,我如何获取 URL?
- javascript - 将对象的 json 数组转换为不同的格式
- python - Python - 查找字符串中第一次出现的字符串列表的索引位置
- asp.net - 哪个是创建包含图像处理算法的 Web 应用程序的最佳平台?
- css - 删除 Laravel/Vue 引导 CSS
- reactjs - 使用 react-router-dom 处理路由和指向 id 的链接
- python - 在 python 中使用 LogAdapter 自定义日志级别