Oracle оптимизация запроса без подзапроса - PullRequest
0 голосов
/ 28 мая 2020

Я хочу сделать свой запрос более оптимизированным и простым. Мне нужно получить только те T_ID, оценка которых максимальна, и если этот T_ID имеет Msg 'C', то его не следует включать.

Мои данные выглядят так:

enter image description here

Мой запрос:

SELECT DISTINCT T_ID, Msg, MAX(Score) over (Partition by T_ID)
FROM Sample
WHERE T_ID NOT IN (SELECT T_ID FROM Sample WHERE Msg = 'C');

Мой ответ:

enter image description here

Есть ли способ добиться этого, вызвав базу данных только один раз.

1 Ответ

0 голосов
/ 28 мая 2020

Совет №1: изображения не способствуют созданию тестового примера с вашими данными: - (

Но вы можете сделать что-то вроде этого, если "0" является подходящей границей (или, возможно, -1)

SQL> with t as (
  2    select 77 t_id, 'N' msg, 220 score from dual union all
  3    select 77 t_id, 'C' msg, 220 score from dual union all
  4    select  1 t_id, 'N' msg, 120 score from dual union all
  5    select  1 t_id, 'N' msg, 102 score from dual union all
  6    select  2 t_id, 'N' msg, 112 score from dual union all
  7    select  2 t_id, 'C' msg, 152 score from dual union all
  8    select  3 t_id, 'N' msg, 172 score from dual union all
  9    select  3 t_id, 'N' msg, 192 score from dual union all
 10    select  4 t_id, 'N' msg, 100 score from dual union all
 11    select  5 t_id, 'N' msg, 101 score from dual
 12  )
 13  select t_id, max(score)
 14  from t
 15  group by t_id
 16  having min(decode(msg,'C',0,score)) > 0;

      T_ID MAX(SCORE)
---------- ----------
         1        120
         4        100
         5        101
         3        192
...