PostgreSQL, предложение NOT IN - PullRequest
0 голосов
/ 20 мая 2018

Я хочу рассчитать DAU и исключить пользователя, которого мы не считаем «реальным» (сотрудники, бета-тестеры и т. Д.).

Раньше все работало нормально, когда я писал фильтрацию в запросе:

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 «не пользователей», которые я хочу исключить).Тем не менее, это дает мне более высокие показатели.Это похоже на то, что отдельное утверждение не работает.

Я добавил NOT NULL в подзапрос, но не изменил результат.Есть ли что-то с подзапросом 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

1 Ответ

0 голосов
/ 20 мая 2018

Да.Если какое-либо из значений в подзапросе равно NULL, то NOT IN не возвращает строк. По этой причине я настоятельно рекомендую всегда использовать NOT EXISTS - он ведет себя, как и ожидалось.

Похоже, выЗнайте это, потому что вы используете NULL сравнение в 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;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...