PostgreSQL用OVER PARTITION BY date计算多投资者合并日度统计数据
PostgreSQL多投资者日度收益统计查询
本问题延续自PostgreSQL投资者日度投资占比计算相关的已有问题。
基于原有问题的逻辑,我需要编写一个SQL查询,基于多名投资者的投资数据生成日度统计指标。
需求示例
假设共有4名投资者,我需要获取其中2名投资者的合并日度统计数据,最终输出的表结构如下:
| date | total_profit | total_investment | user_investment | investment_share | user_share | user_profit |
|---|---|---|---|---|---|---|
| 2021-01-01 | 500 | 10000 | 5000 | 50.00 | 38.2865 | 95.71625 |
| 2021-01-02 | 200 | 10000 | 5000 | 50.00 | 38.2865 | 38.2865 |
| 2021-01-03 | 185 | 15000 | 2500 | 16.66 | 16.3336 | 15.1085 |
| 2021-01-04 | 175 | 15000 | 3000 | 20.00 | 11.2478 | 9.8418 |
| 2021-01-05 | 229 | 15000 | 3000 | 20.00 | 11.2478 | 12.8787 |
字段说明
- date:对应daily_stats表中利润数据所属的日期
- total_profit:daily_stats表对应日期行的profit字段值
- total_investment:对应日期所有投资者的投资总金额
- user_investment:对应日期选中的目标投资者的投资总金额
- investment_share:选中用户的投资对应的percent字段按投资金额加权后的合并值,计算公式为:
(i.amount / (SUM(i.amount) over (partition by s.date))) * i.percent
举个例子,若我统计的2名用户在目标日期范围内各有1笔投资,percent字段的合并值计算方式如下:
| 投资归属 | amount | percent |
|---|---|---|
| 用户1 | 500 | 20 |
| 用户2 | 200 | 45 |
计算公式为:( (500 / (500 + 200) ) * 20) + ( (200 / (500 + 200) ) * 45)
也可以简化为:(20 * 500 + 45 * 200) / (500 + 200)
结合现有查询的结构,我认为第一种方式实现难度更低。我是用电子表格模拟的计算逻辑,你可以复制到各类表格工具中辅助验证。
- user_share:选中投资者的合并投资金额占总投资金额的比例,对应可分配利润的占比,示例:
(500 + 200) / 15000 = user_share = 0.046 (4.6%) - user_profit:最终选中用户可获得的收益,计算公式为
total_profit * investment_share * user_share
我不确定是不是存在基础数学错误,现在刚好是午餐时间,没法再归咎于疲劳了:P
我已经写了初步的测试实现,还有很多问题需要优化。
内容的提问来源于stack exchange,提问作者Dioralop
相关产品推荐
相关产品推荐

