2016-07-19 53 views
0

我目前有一个accounts表和一个account_activity表。 accounts表的相关列为id。在account_activity表中,我有id,account_id,action_nameoccured列。每次登录的用户数量每周计数

我希望能够绘制的多少用户登录的0次,1次,2次,n次在给定时间内的图形(可以说WHERE occured BETWEEN now() AND now() - interval '1 week'

据我得到的选择每个用户登录,使用下面的查询量:

SELECT 
    a.id, 
    count(aa.*) AS logins 
FROM 
    account a 
LEFT JOIN 
    account_activity aa 
ON 
    a.id = aa.account_id AND 
    aa.action_name = 'logIn' 
GROUP BY 
    a.id 

这返回的id S和logins计数的列表。现在,我要选择具有登录每个帐户数高于n被归类为n,所以:

SELECT 
    a.id, 
    LEAST(count(aa.*), 10) AS logins 
FROM 
    account a 
LEFT JOIN 
    account_activity aa 
ON 
    a.id = aa.account_id AND 
    aa.action_name = 'logIn' 
GROUP BY 
    a.id 

在这种情况下,logins永远不会(查询10)高于n。完全是我想要的方式。但结果现在需要我手动遍历所有行,将它们插入到一个临时对象,并增加从0每个键的计数n其中row['logins'] == key

我想获得这样的结果:

| logins | count | 
|--------|-------| 
|  0 | 10 | 
|  1 | 130 | 
|  2 | 14 | 
| ... | ... | 
|  n | 1830 | 

我不知道我怎么会能够做到这一点在PGSQL

+0

我已经阅读了这3次,并且无法在给定的时间范围要求中通过0次,1次,2次,n次登录的_how多个用户。需求中还有其他的东西吗? –

+0

我希望能够看到有多少用户处于活动状态。如果有人在上周内登录了10次,该人员非常活跃。如果有人本周没有登录,那么这个人是不活跃的。 –

回答

0

这是我从这个问题的理解:

select logins, count(*) as users 
from (
    select count(*) as logins 
    from account_activity aa 
    where action_name = 'logIn' 
    group by account_id 
) 
group by logins 
order by logins 
+0

您将错过0登录帐户。 – NovaDenizen

0
SElECT q2.logins as logins, count(*) AS num_users FROM 
(
    SELECT sq.account_id AS account_id, sum(sq.login_count) AS logins FROM (
     (SELECT account_id, 1 AS login_count FROM 
      account_activity WHERE action_name = 'login') 
     UNION ALL 
     (SELECT id AS account_id, 0 AS login_count FROM accounts) 
    ) AS sq 
    GROUP BY account_id 
) AS q2 
GROUP BY q2.logins;