Как выполнить разбиение окна с условиями (Oracle) - PullRequest
0 голосов
/ 13 ноября 2018

Мне нужно знать, как сузить окно разбиения с условием. Например, если у меня есть следующее:

SELECT
  T1.*,
  COUNT(T1.ID) OVER (PARTITION BY ID)
FROM TBL T1
WHERE /* some other conditions */;

Мне нужно, чтобы раздел идентификатора был только подмножеством всех идентификаторов, которые имеют T1.TYPE = 'J'.

+---------+--------+---------------+--------+
| ID      | TYPE   | OTH1          | OTH2   |
+---------+--------+---------------+--------+
| 1       | K      | 500           | RER    |
| 1       | J      | 503           | LEL    |
| 1       | J      | 534           | KEL    |
| 2       | J      | 536           | NULL   |
| 2       | J      | 667           | ERT    |
| 2       | J      | 98            | NULL   |
+---------+--------+---------------+--------+

В этом наборе данных мне нужно учитывать только количество окон, если TYPE = J, поэтому для ID = 1 значение должно быть 2, а не 3, поскольку первая строка TYPE = K (ID = 2, где счет 3).

Возможно ли это?

1 Ответ

0 голосов
/ 13 ноября 2018

Возможно, условное агрегирование - это то, что вы хотите здесь:

SELECT
      t.*,
      COUNT(CASE WHEN TYPE = 'J' THEN 1 END) OVER (PARTITION BY ID) cnt
FROM TBL t

Если вы хотите отобразить этот счетчик только для тех записей, которые на самом деле имеют тип J, то мы можем попробовать:

SELECT
      t.*,
      CASE WHEN TYPE = 'J'
           THEN COUNT(CASE WHEN TYPE = 'J' THEN 1 END) OVER (PARTITION BY ID)
           ELSE 0 END cnt
FROM TBL t
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...