самостоятельно объединяет одну и ту же таблицу для группировки строк, которые совместно используют подстроку - PullRequest
0 голосов
/ 04 июля 2019

У меня есть таблица с несколькими строками, которые разделяют подстроку в определенном столбце, и я хочу сгруппировать их вместе.

Например, у меня может быть

ID | Service     | Function
__________________________________________
 1 | abc1234hgf  | Create
 2 | bvc8554mnb  | Create
 3 | cxz1234poi  | Update

Я пытаюсь записать запрос для группировки строк, которые разделяют подстроку числа в Service (так что 1234 в этом примере) и имеют как обновление, так и запись создания, так что это будет результат :

ID  | Service | Function
________________________
 1  | 1234    |  Create
 3  | 1234    |  Update

Итак, я попытался написать запрос, который выполняет самостоятельное объединение, потому что обновление происходит только в том случае, если уже есть строка создания, поэтому я подумал, что могу вернуться назад: найти строки с записью обновления, взять оттуда подстроку службы и присоединить ее к найти остальное создает.

SELECT a.id, a.service, a.function
FROM audits a
INNER JOIN audits b
ON a.service = SUBSTR(b.service, 4, 8);

теперь это дает мне все 4-значные #, сгруппированные вместе, но я хочу ограничиться функцией WHERE в ('update', 'create'). Когда я пытаюсь либо, хотя я получаю ноль.

Я на правильном пути?

Ответы [ 3 ]

2 голосов
/ 04 июля 2019

Вы можете сделать это с помощью EXISTS:

SELECT a.id, SUBSTR(a.service, 4, 8) as service, a.function
FROM audits a
WHERE a.function IN ('create', 'update') AND
      EXISTS (SELECT 1
              FROM audits a2
              WHERE SUBSTR(a2.service, 4, 8) = SUBSTR(a.service, 4, 8) AND
                    a2.function IN ('create', 'update') AND
                    a2.function <> a.function
             );
0 голосов
/ 04 июля 2019
with t (ID, Service, func) as (
  select 1 ,'abc1234hgf','Create' from dual union all
  select 6 ,'abc1234hgf','Create' from dual union all
  select 7 ,'abc1234hgf','Create' from dual union all
  select 9 ,'abc1234hgf','Create' from dual union all
  select 10 ,'abc1234hgf','Create' from dual union all
  select 2 ,'bvc8554mnb','Create' from dual union all
  select 3 ,'cxz1234poi','Update' from dual union all
  select 8 ,'cxz1234poi','Update' from dual union all
  select 4 ,'bvc8551mnb','Create' from dual union all
  select 5 ,'bvc8552mnq','Create' from dual 
)
select id, service, func from (
  select id, service, func, idx, rn, count(*) over (partition by idx, rn) cnt from (
    select t.*
    , substr(service, 4, 4) idx
    , row_number() over(partition by substr(service, 4, 4), decode(func, 'Create', 1, 'Update', 2) order by id) rn 
    from t
  )
)
where cnt = 2
order by idx, id
;

        ID SERVICE    FUNC 
---------- ---------- ------
         1 abc1234hgf Create 
         3 cxz1234poi Update 
         6 abc1234hgf Create 
         8 cxz1234poi Update 
0 голосов
/ 04 июля 2019

Вам не нужно объединение;вместо этого вы можете использовать аналитические функции для сканирования одной таблицы:

Установка Oracle :

CREATE TABLE audits ( ID, Service, Function ) AS
  SELECT 1, 'abc1234hgf', 'Create' FROM DUAL UNION ALL
  SELECT 2, 'bvc8554mnb', 'Create' FROM DUAL UNION ALL
  SELECT 3, 'cxz1234poi', 'Update' FROM DUAL

Запрос :

SELECT id,
       service,
       function
FROM   (
  SELECT id,
         SUBSTR( service, 4, 4 ) AS service,
         function,
         COUNT( CASE function WHEN 'Create' THEN 1 END )
           OVER ( PARTITION BY SUBSTR( service, 4, 4 ) ) AS num_create,
         COUNT( CASE function WHEN 'Update' THEN 1 END )
           OVER ( PARTITION BY SUBSTR( service, 4, 4 ) ) AS num_update
  FROM   audits
)
WHERE  num_create > 0
AND    num_update > 0

Выход :

ID | SERVICE | FUNCTION
-: | :------ | :-------
 1 | 1234    | Create  
 3 | 1234    | Update  

дБ <> скрипка здесь

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