首页 > 解决方案 > 如何在 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

但这给了我一个错误“聚合函数调用不能包含窗口函数调用”

有人知道怎么做吗?

标签: postgresql

解决方案


使用一个简单的子查询很容易:

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;

推荐阅读