假设我有一张
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中按照描述的要求计算百分位数?
问题大概在于percentile_cont(和朋友)是一个“有序集合聚合”,因此不适合与窗口函数一起使用/作为窗口函数。
您可以在 PostgreSQL wiki 上找到该问题解决方法的讨论。基本上,您将实现自己的聚合函数,它不是“有序集合聚合”,因此以正常方式将状态保留在内存中,但可以用作窗口函数。您可能需要在 C 中执行此操作才能获得良好的性能。您可能还需要处理内存问题,但这里没有足够的信息来提供进一步的建议。