每月累计用户数不同

时间:2018-03-16 20:07:01

标签: sql amazon-redshift

我想按月获得累计用户数和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

2 个答案:

答案 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

我希望这是你正在寻求的!

SQL Fiddle