我目前有一个accounts
表和一个account_activity
表。 accounts
表的相关列为id
。在account_activity
表格中,我有列id
,account_id
,action_name
和occured
。
我希望能够绘制一个图表,显示在给定时间范围内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
和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
永远不会高于n
(查询中为10)。正是我想要的方式。但结果现在要求我手动遍历所有行,将它们插入临时对象,并将每个键的计数从0
递增到n
row['logins'] == key
我想得到这样的结果:
| logins | count |
|--------|-------|
| 0 | 10 |
| 1 | 130 |
| 2 | 14 |
| ... | ... |
| n | 1830 |
我不知道我怎么能在PgSQL中做到这一点
答案 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;