SQL - использовать внутри 'where' 'over (partition by ...)' - PullRequest
0 голосов
/ 09 января 2019

Как я могу получить результаты из SQL-запроса, в котором заголовок запускается более одного раза? Это показывает правильные значения для 'PPP', но фильтрация AND (count(*) over (partition by TITLE)) > 1 не работает.

Любая помощь будет оценена.

SELECT
    AAA,
    BBB,
    CCC,
    count(*) over (partition by TITLE) as PPP
FROM 
    my_tabel
WHERE
    AAA IS NOT NULL
    AND BBB = 'SOMETHING'
    AND (count(*) over (partition by TITLE)) > 1
;

возвращенная ошибка

ERROR: window functions are not allowed in WHERE

Когда я использовал

...
    WHERE
        AAA IS NOT NULL
        AND BBB = 'SOMETHING'
;

все отображается правильно, но я хочу столбец, где PPP> 1

Ответы [ 3 ]

0 голосов
/ 09 января 2019

Вы также можете создать CTE следующим образом и использовать PPP из CTE для добавления фильтров:

    WITH cte AS(
    SELECT
        AAA,
        BBB,
        CCC,
        count(*) over (partition by TITLE) as PPP
    FROM 
        my_tabel
    WHERE
        AAA IS NOT NULL
        AND BBB = 'SOMETHING'
        )
    Select *
    FROM CTE
    WHERE PPP > 1;
0 голосов
/ 09 января 2019

Если у вас есть уникальный идентификатор для каждой строки - который вы должны - просто используйте exists:

select t.*
from my_table t
where aaa is not null and bbb = 'something' and
      exists (select 1
              from my_table t2
              where t2.title = t.title and
                    t2.aaa is not null and t2.bbb = t.bbb and
                    t2.id <> t.id
            );

Предполагается, что вы не нуждаетесь в подсчете для других целей.

0 голосов
/ 09 января 2019

Оконные функции нельзя использовать в предложениях WHERE, так как их результат вычисляется после того, как были получены строки, удовлетворяющие предложению WHERE. Оберните еще один SELECT вокруг него и отфильтруйте WHERE этого SELECT.

SELECT aaa,
       bbb,
       ccc,
       ppp
       FROM (SELECT aaa,
                    bbb,
                    ccc,
                    count(*) OVER (PARTITION BY title) ppp
                    FROM my_tabel
                    WHERE aaa IS NOT NULL
                          AND bbb = 'SOMETHING') x
       WHERE ppp > 1;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...