部分模式下的 PostgreSQL / TimescaleDB 百分位数

问题描述 投票:0回答:1

假设我有一张

results
桌子:

结果_id attr_id 用户ID 价值 时间戳
1 1 1 100 2024-02-10 14:30:15.248087+00
2 2 1 111 2024-02-10 10:30:15.248087+00
3 1 1 122 2024-02-09 14:30:15.248087+00
4 2 1 162 2024-02-08 10:30:15.248087+00
5 1 2 119 2024-02-10 14:30:15.248087+00
6 2 2 128 2024-02-10 10:30:15.248087+00
7 1 2 137 2024-02-09 14:30:15.248087+00
8 2 2 146 2024-02-08 10:30:15.248087+00

我需要计算当前行之前的

user_id
attr_id
分区上的每一行的百分位数,并且仅以 10 天为间隔。我可以通过这种方式计算标准差,因为它支持部分模式:

SELECT
  stddev(value) OVER (
    PARTITION BY user_id, attr_id
    ORDER BY timestamp ASC RANGE BETWEEN '10 days'::interval PRECEDING AND CURRENT ROW
    EXCLUDE CURRENT ROW
  ) AS stddev_efficiency
FROM results;

有没有办法在postgresql/timescaleDB中按照描述的要求计算百分位数?

postgresql statistics data-analysis timescaledb
1个回答
0
投票

问题大概在于percentile_cont(和朋友)是一个“有序集合聚合”,因此不适合与窗口函数一起使用/作为窗口函数。

您可以在 PostgreSQL wiki 上找到该问题解决方法的讨论。基本上,您将实现自己的聚合函数,它不是“有序集合聚合”,因此以正常方式将状态保留在内存中,但可以用作窗口函数。您可能需要在 C 中执行此操作才能获得良好的性能。您可能还需要处理内存问题,但这里没有足够的信息来提供进一步的建议。

© www.soinside.com 2019 - 2024. All rights reserved.