Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/google-app-engine/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 基于事件计数对用户进行计数_Sql_Postgresql - Fatal编程技术网

Sql 基于事件计数对用户进行计数

Sql 基于事件计数对用户进行计数,sql,postgresql,Sql,Postgresql,我有一个事件表,其中当前有按日期分组的用户计数。我想根据用户发生特定事件的次数进行两次不同的计数(我们称之为事件a)。第一次计数将对用户进行计数,如果事件a对用户恰好出现1次,第二次计数将对用户进行计数,如果事件a对用户出现多次 我相信要实现这一点,我需要一个案例,但我不确定如何正确编写代码,以提供我需要的输出。目前我拥有的是: SELECT calendar_date, COUNT(distinct(users)) AS n_users, COUNT(distinct CASE WHE

我有一个事件表,其中当前有按日期分组的用户计数。我想根据用户发生特定事件的次数进行两次不同的计数(我们称之为事件a)。第一次计数将对用户进行计数,如果事件a对用户恰好出现1次,第二次计数将对用户进行计数,如果事件a对用户出现多次

我相信要实现这一点,我需要一个案例,但我不确定如何正确编写代码,以提供我需要的输出。目前我拥有的是:

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…你不接受这个答案有什么原因吗?