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发布。解释表和列的语义以及要查询的内容。包括与样本数据对应的预期结果。然后我们可能会帮助您找到正确的查询。旁注:尽量避免使用子查询中的大数据集。相反,使用存在。