我想按月获得累计用户数和AUM数。但是,用户可以有多个目标,这些目标对应于帐户,而帐户可以有多个位置。
http://sqlfiddle.com/#!15/f3c59/2
正如您所看到的,这不起作用,因为用户1在2/1/18中具有300 AUM,然后再次在3/1/18中计算400 AUM。累积起来,我们说有3个用户(而不是3个目标),实际上只有2个用户。
有没有办法让这个独立于每月分组?那么2/1/18有2个客户有500个AUM,3/1/18还有2个客户但有900个AUM?
预期产出:
month users AUM
2/1/18 2 500
3/1/18 2 900
答案 0 :(得分:1)
我实际上有一个适合你的解决方案,但它非常非常慢!!
select distinct date_trunc('month', a.date),
(select count(distinct g.user_id)
from goals g
join accounts ac on ac.goal_id = g.id
where date_trunc('month', ac.date) <= date_trunc('month', a.date)
and ac.status = 'current'),
(select sum(p.amount)
from positions p
join accounts acc on acc.id = p.account_id
where date_trunc('month', acc.date) <= date_trunc('month', a.date)
and acc.status='current')
from accounts a
where a.status = 'current'
如果没有子查询,我真的看不到这样做的方法。事实上,我认为,您的数据模型存在缺陷。我花了很多时间来确保关系正确,经过一段时间我意识到,你甚至不需要&#34;目标&#34;和&#34;用户&#34;桌子为您的目的。
我实际上没有什么好的线索,如何在不了解整个数据库结构的情况下改进数据模型。我的第一步是在您的&#34;帐户&#34;中存储单独的值。 table,表示时间段,其中位置必须总结。我还考虑过移动&#34; date&#34;值得一个单独的表,但我再也不知道整个数据库 - 所以这些只是简单的想法。
答案 1 :(得分:0)
我想我已经得到了你需要的东西(有点!)
如果我说得对,样本上的正确答案将是:
| month | users | amount |
|----------------------|-------|--------|
| 2018-02-01T00:00:00Z | 2 | 500 |
| 2018-03-01T00:00:00Z | 3 | 900 |
第3个月将有1个用户,而第2个月(上个月)将有另外2个累积用户。
用户在第3个月有400美元,所以当我们将上个月的金额加到它上面时,它将是$ 900(400 + 500)...
如果这是您正在寻找的, 那么这是对它的查询:
SELECT
month,
SUM(users) OVER(ORDER BY month ASC) AS users,
SUM(AUM) OVER(ORDER BY month ASC) AS amount
FROM (
select
date_trunc('month',date) as month,
count(distinct u.id) users,
sum(amount) AUM
from users u
join goals g on u.id=g.user_id
join accounts s on g.id=s.goal_id
join positions p on s.id=p.account_id
where status='current'
group by 1
) D
我希望这是你正在寻求的!