Sql 基于事件计数对用户进行计数
我有一个事件表,其中当前有按日期分组的用户计数。我想根据用户发生特定事件的次数进行两次不同的计数(我们称之为事件a)。第一次计数将对用户进行计数,如果事件a对用户恰好出现1次,第二次计数将对用户进行计数,如果事件a对用户出现多次 我相信要实现这一点,我需要一个案例,但我不确定如何正确编写代码,以提供我需要的输出。目前我拥有的是:Sql 基于事件计数对用户进行计数,sql,postgresql,Sql,Postgresql,我有一个事件表,其中当前有按日期分组的用户计数。我想根据用户发生特定事件的次数进行两次不同的计数(我们称之为事件a)。第一次计数将对用户进行计数,如果事件a对用户恰好出现1次,第二次计数将对用户进行计数,如果事件a对用户出现多次 我相信要实现这一点,我需要一个案例,但我不确定如何正确编写代码,以提供我需要的输出。目前我拥有的是: SELECT calendar_date, COUNT(distinct(users)) AS n_users, COUNT(distinct CASE WHE
SELECT calendar_date,
COUNT(distinct(users)) AS n_users,
COUNT(distinct CASE WHEN eventName = 'event_a' THEN users END) AS n_users_event_a,
COUNT(distinct CASE WHEN 'event_a' = 1 THEN userID END) AS bucket_a
COUNT(distinct CASE WHEN 'event_a' > 1 THEN userID END) AS bucket_b
FROM e_table
WHERE calendar_date >= '2019-10-01'
AND event_name IN ('event_a', 'event_b', 'event_c')
GROUP BY 1
ORDER BY 1;
运行此代码时,会收到错误消息:
查询1错误:错误:整数的输入语法无效:“事件\u a”
看看我的代码和错误,我之所以看到这个错误是有道理的,因为我试图对字符串进行数学运算。我相信我需要在count语法中使用某种类型的count,但我不确定如何实现这一点。我是在正确的轨道上,还是有不同的方法来解决这个问题 使用两个聚合级别,一个在日期/用户级别,另一个仅用于日期:
SELECT calendar_date,
COUNT(*) AS n_users,
COUNT(*) FILTER (WHERE cnt_a > 0) AS n_users_event_a,
COUNT(*) FILTER (WHERE cnt_a = 1) AS n_users_event_a_1,
COUNT(*) FILTER (WHERE cnt_a > 1) AS n_users_event_a_2pl
FROM (SELECT calendar_date, user, eventName, count(*) as cnt,
COUNT(*) FILTER (WHERE eventName = 'event_a') as cnt_a
FROM e_table
WHERE calendar_date >= '2019-10-01' AND
event_name IN ('event_a', 'event_b', 'event_c')
GROUP BY calendar_date, user
) e
GROUP BY 1
ORDER BY 1;
编辑:
您可以将过滤器
替换为:
SELECT calendar_date,
COUNT(*) AS n_users,
SUM( (cnt_a > 0)::int ) AS n_users_event_a,
SUM( (cnt_a = 1)::int ) AS n_users_event_a_1,
SUM( (cnt_a > 1)::int ) AS n_users_event_a_2pl
你可以试试:
SELECT x.calendar_date
, x.n_users
, COUNT(DISTINCT y.users) AS n_users_event_a
, SUM(CASE WHEN y.cnt = 1 THEN 1 ELSE 0 END) AS bucket_a
, SUM(CASE WHEN y.cnt > 1 THEN 1 ELSE 0 END) AS bucket_b
FROM (
SELECT calendar_date
, COUNT(1) AS n_users
FROM e_table
WHERE calendar_date >= '2019-10-01' AND event_name IN (
'event_a'
, 'event_b'
, 'event_c'
)
GROUP BY calendar_date
) x
INNER JOIN (
SELECT users
, calendar_date
, count(1) AS cnt
FROM e_table
WHERE calendar_date >= '2019-10-01' AND event_name = 'event_a'
GROUP BY users
, calendar_date
) y ON x.calendar_date = y.calendar_date
GROUP BY x.calendar_date
, x.n_users
您缺少一个结束单引号。我尝试运行此命令时出错:>Query 1错误:错误:语法错误位于或接近“(”查看该查询,我不确定语法错误发生在哪里。@EJWPF…该错误在哪一行?如果您使用的是旧版本的Postgres,则问题可能是
FILTER
子句。这似乎就是问题所在。进行了一些测试,当我包含FILTER子句时,它似乎出错了。FILTER的替换工作正常谢谢你的帮助!@EJWPF…你不接受这个答案有什么原因吗?