Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/77.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
PostgreSQL,不在子句中 我想计算DAU并排除用户,我们不考虑真实雇员、beta测试者等。_Sql_Postgresql_Analytics - Fatal编程技术网

PostgreSQL,不在子句中 我想计算DAU并排除用户,我们不考虑真实雇员、beta测试者等。

PostgreSQL,不在子句中 我想计算DAU并排除用户,我们不考虑真实雇员、beta测试者等。,sql,postgresql,analytics,Sql,Postgresql,Analytics,我之前在查询中编写过滤时,它工作得很好: SELECT count(distinct user_id) AS daily, e.event_timestamp::DATE AS date FROM "public"."events" AS e WHERE user_id IN (SELECT distinct id from "user"."user" WHERE

我之前在查询中编写过滤时,它工作得很好:

SELECT 
    count(distinct user_id) AS daily, 
    e.event_timestamp::DATE AS date
FROM 
    "public"."events" AS e
WHERE
   user_id IN (SELECT  
           distinct id
        from
            "user"."user"
        WHERE 
            username IS NOT NULL AND position IS NOT NULL )
GROUP BY date
当我尝试将其更改为以下值时,基本上应该给出大致相同的计数,而不是定义4000个真正的用户,我定义了1000个我想要排除的非用户。然而,这给了我更高的计数。这就好像独特的陈述不起作用

我将NOTNULL添加到子查询中,但没有更改结果。NOT IN+子查询是否有其他方式比IN子句更有效

SELECT 
    count(distinct e.user_id) AS daily, 
    e.event_timestamp::DATE AS date
FROM 
    "public"."events" AS e
WHERE
   e.user_id NOT IN (SELECT distinct id FROM "public"."non_users" WHERE id IS NOT NULL)
GROUP BY 
    date
ORDER BY
    date

对。如果子查询中的任何值为NULL,则NOT in不会返回任何行。因此,我强烈建议您始终使用NOT EXISTS-它的行为与预期的一样

您似乎知道这一点,因为您在WHERE中使用了空比较。所以,这种差异可能是由于另一个条件造成的。因此,也包括:

SELECT count(distinct e.user_id) AS daily, 
       e.event_timestamp::DATE AS date
FROM  "public"."events" e
WHERE NOT EXISTS (SELECT 1
                  FROM "public"."non_users" nu
                  WHERE e.user_id = nu.id AND
                        nu.position IS NOT NULL
                 )
GROUP BY date
ORDER BY date;
这只是另一个条件,然后是前一个条件。而且它可能匹配更多的记录,这没什么不寻常的。将表的DDL和一些示例数据作为DML发布。解释表和列的语义以及要查询的内容。包括与样本数据对应的预期结果。然后我们可能会帮助您找到正确的查询。旁注:尽量避免使用子查询中的大数据集。相反,使用存在。