Как сгруппировать и применить функцию в Oracle SQL - PullRequest
0 голосов
/ 01 апреля 2020

У меня есть таблицы, подобные приведенным ниже.

Я хотел бы вычесть все customers, у которых есть product = A

product  customer
A        A
B        A
C        B
B        B
A        C
B        C
.        .
.        .
.        . 

Поэтому мой желаемый результат как ниже

product  customer
A        A
B        A
A        C
B        C

группировка по customer и затем вычитание ...

Но я новичок, и я не придумал.

Если у кого-то есть мнение, пожалуйста, дайте мне знать .

Спасибо

Ответы [ 2 ]

1 голос
/ 01 апреля 2020

Мы также можем попробовать использовать COUNT в качестве аналитической функции c здесь с условным агрегированием:

WITH cte AS (
    SELECT t.*,
        COUNT(CASE WHEN product = 'A' THEN 1 END) OVER (PARTITION BY customer) AS a_cnt
    FROM yourTable t
)

SELECT product, customer
FROM cte
WHERE a_cnt > 0;
1 голос
/ 01 апреля 2020

Я думаю, что вы имеете в виду «возврат», а не «вычитание». Вы можете использовать exists:

select t.*
from t
where exists (select 1
              from t t2
              where t2.customer = t.customer and t2.product = 'A'
             );

Для лучшей производительности вы хотите индекс на (customer, product). С таким индексом это, вероятно, самый быстрый подход.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...