Oracle SQL проверка наличия двух значений в разделе - PullRequest
0 голосов
/ 20 февраля 2020

Попытка проверить, существуют ли data_type 'G' и 'J' для данного идентификатора, если true отображать 'Both', иначе выведите data_type. Помощь с оператором SQL приветствуется.

SELECT 
        data_type,
        id,
        max(case 
        when data_type= 'G' and data_type= 'J' then 'Both'
        else data_type
        end) over (partition by id order by id) as
         condition
    FROM my_table;

желаемый результат

+-----------+-----+-----------+
| data_type | id  | condition |
+-----------+-----+-----------+
| J         |  A  |  Both     |
| J         |  A  |  Both     |
| G         |  A  |  Both     |
| J         |  A  |  Both     |
| J         |  B  |  J        |
| J         |  B  |  J        |
| J         |  B  |  J        |
+-----------+-----+-----------+

Ответы [ 2 ]

0 голосов
/ 20 февраля 2020

Используйте DECODE с оконной функцией COUNT(DISTINCT...). Т.е.

SELECT t.*, 
       DECODE(count(distinct data_type) over ( partition by id), 
         1, data_type,
         2, 'Both'
         ) condition
FROM test_data t;

Пример

with test_data ( data_type, id ) AS (
SELECT 'J','A' FROM DUAL UNION ALL
SELECT 'J','A' FROM DUAL UNION ALL
SELECT 'G','A' FROM DUAL UNION ALL
SELECT 'J','A' FROM DUAL UNION ALL
SELECT 'J','B' FROM DUAL UNION ALL
SELECT 'J','B' FROM DUAL UNION ALL
SELECT 'J','B' FROM DUAL)
SELECT t.*, DECODE(count(distinct data_type) over ( partition by id), 1, data_type, 2, 'Both') condition
FROM test_data t;
+-----------+----+-----------+
| DATA_TYPE | ID | CONDITION |
+-----------+----+-----------+
| G         | A  | Both      |
| J         | A  | Both      |
| J         | A  | Both      |
| J         | A  | Both      |
| J         | B  | J         |
| J         | B  | J         |
| J         | B  | J         |
+-----------+----+-----------+
0 голосов
/ 20 февраля 2020

Если у вас есть только "G" и "J", вы можете использовать функции analyti c и case logi c:

select t.*,
       (case when sum(case when data_type = 'G' then 1 else 0 end) over (partition by id) > 0 and
                  data_type = 'J'
             then 'Both'
             when sum(case when data_type = 'J' then 1 else 0 end) over (partition by id) > 0 and
                  data_type = 'G'
             then 'Both'
             else data_type
        end) as condition              
from my_table t;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...