Oracle Query [нужен подзапрос?] - PullRequest
1 голос
/ 31 мая 2019

при условии, что у меня есть следующая таблица:

NUM  TYPE  STAT   ERR
123   10      6    62
123   10      6    62
123   10      6    62
123   17      4     0
321   10      6    62
321   10      6    62

В настоящее время я использую следующий запрос:

select MIN(NUM) as NUMBER
     , MIN(STAT) as STATUS
     , MIN(ERR) as ERROR
     , MIN(retry) as RETRY 
 from TABLE_TB 
where ERR=62 
group by NUM 
having count(ERR) > 1;

Вывод будет:

NUM  TYPE  STAT   ERR  RETRY
123   10      6    62      3
321   10      6    62      2

Это нормально, но мне нужно, чтобы запрос выдавал только NUM WITH ERR = 62, но также и с ERR = 0, исключая тех, у кого ERR = 62, но без ERR = 0.Взяв первую таблицу в качестве примера, запрос должен вывести

NUM  TYPE  STAT   ERR  RETRY
123   10      6    62      3

Это потому, что NUM 123 имеет ERR = 62 (3 вхождения), а также ERR = 0.Таким образом, NUM 321 будет исключено, потому что даже если ERR = 62, у него нет ERR = 0.

Надеюсь, это cliear:)

Большое спасибо.Lucas

Ответы [ 3 ]

1 голос
/ 31 мая 2019

Вам нужно сначала отфильтровать таблицу по err in (62, 0), а затем узнать, сколько у вас различных типов ошибок (вам нужно 2, поскольку у вас есть два кода ошибки, которые вас интересуют).

Получив эту информацию, вы можете отфильтровать строки, в которых err = 62, а счетчик отличных = 2 - например ::

WITH results as (select num,
                        type,
                        stat,
                        err,
                        retry,
                        count(distinct err) over (partition by num) num_err_types
                 from   table_tb
                 where  err in (62, 0))
select min(num) as nmbr,
       min(stat) as status,
       min(err) as ERROR,
       min(retry) as retry
from   results
where  err = 62
and    num_err_types = 2;

Я использовал аналитическую функцию COUNT(), чтобы найти различное число - таким образом, значение добавляется к каждой строке, независимо от кода ошибки, что позволяет нам фильтровать его в конечном запросе.

1 голос
/ 31 мая 2019

Или, может быть, вы можете попробовать этот путь, простой и сладкий ...select MIN(NUM) as NUMBER , MIN(STAT) as STATUS , MAX(ERR) as ERROR , Count(*) as RETRY from TestTable where ERR IN (62 ,0) group by NUM having count(ERR) > 1 AND MIN(ERR)=0;

1 голос
/ 31 мая 2019

Вы можете использовать подзапрос:

SELECT num
     , MIN(type) AS type
     , MIN(stat) AS status
     , MIN(err) AS err
     , COUNT(*) AS retry
FROM table_tb
WHERE err != 0 AND
      num IN (SELECT num FROM tb WHERE err = 0)
GROUP BY num;

или без подзапроса:

SELECT num
     , MIN(CASE WHEN err != 0 THEN type END) AS type
     , MIN(CASE WHEN err != 0 THEN stat END) AS stat
     , MIN(CASE WHEN err != 0 THEN err END) AS err
     , COUNT(CASE WHEN err != 0 THEN 1 END) AS retry
FROM table_tb
GROUP BY num
HAVING COUNT(DECODE(err, 0, 1)) > 0;

Выход:

+-----+------+------+-----+-------+
| NUM | TYPE | STAT | ERR | RETRY |
+-----+------+------+-----+-------+
| 123 |   10 |    6 |  62 |     3 |
+-----+------+------+-----+-------+
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...