计算每周每次登录计数的用户数量

时间:2016-07-19 19:04:48

标签: postgresql

我目前有一个accounts表和一个account_activity表。 accounts表的相关列为id。在account_activity表格中,我有列idaccount_idaction_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

这将返回idlogins计数的列表。现在,我想选择登录次数高于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永远不会高于n(查询中为10)。正是我想要的方式。但结果现在要求我手动遍历所有行,将它们插入临时对象,并将每个键的计数从0递增到n row['logins'] == key

我想得到这样的结果:

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

我不知道我怎么能在PgSQL中做到这一点

2 个答案:

答案 0 :(得分: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

答案 1 :(得分: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;
相关问题