Как сохранить результат SQL в переменной и проанализировать результат, чтобы определить возможный шаблон? - PullRequest
0 голосов
/ 20 мая 2018

Запрос ниже

INSERT INTO temp 
SELECT esd, 
       'E' 
FROM   test_data_sovlp 
WHERE  esd IS NOT NULL 
UNION ALL 
SELECT td, 
       CASE is_db 
         WHEN 0 THEN 'S' 
         WHEN 1 THEN 'H' 
       END AS FLAG 
FROM   test_data_sovlp 
WHERE  td IS NOT NULL 

возвращает следующие данные:

|----------|----------|
|  DT      |  FLAG    |
|----------|----------|
|  10      |  E       |
|  20      |  H       |
|  30      |  E       |
|  40      |  E       |
|  50      |  E       |
|  60      |  S       |
|  70      |  H       |
|  75      |  E       |
|  80      |  H       |
|  100     |  H       |
|----------|----------|

при запуске с этой таблицей:

|----------|----------|----------|----------|----------|
|    ID    |   ESD    |  TD      |   IS_DB  | TEST_SET |
|----------|----------|----------|----------|----------|
|    1     |  10      |  20      |    1     |    2     |
|    2     |  30      |  (null)  |    1     |    2     |
|    3     |  40      |  (null)  |    1     |    2     |
|    4     |  50      |  60      |    0     |    2     |
|    5     |  (null)  |  70      |    1     |    2     |
|    6     |  75      |  100     |    1     |    2     |
|    7     |  (null)  |  80      |    1     |    2     |
|----------|----------|----------|----------|----------|

Примечание : см. Демо здесь или мой предыдущий пост здесь для получения более подробной информации.

Что меня интересует, так это объединение FLAG значение, возвращаемое запросом выше, в порядке DT.

Таким образом, для запроса выше значение конкатенации (назовем это q_result): q_result = EHEEESEHH.

Я хочу затем проанализировать q_result с помощью блока из 2 символов, чтобы обнаружить возможное присутствие любой из следующих последовательностей:

HH      EE      HS      SE

Во время анализа, если шаблон соответствует где-либо в q_result,процедура, которую я хотел бы написать, должна возвращать 0.Если шаблон не соответствует, то процедура должна вернуть 1.

Вопрос

Как это можно сделать?

1 Ответ

0 голосов
/ 20 мая 2018

Если я правильно понимаю, вы можете сделать что-то вроде этого:

select count(*)
from (select listagg(flag) within group (order by dt) as flags
      from temp
     ) x
where not regexp_like(flags, 'HH|EE|HS|SE');

В качестве альтернативы, вы можете использовать lag():

select (case when count(*) = sum(case when flag2 not in ('HH', 'EE', 'HS', 'SE')
             then 1 else 0
        end) as return_value
from (select t.*,
             (lag(flag) over (order by dt) || flag) as flag2
      from temp
     ) t;
...