Oracle Sql SUM MAX - PullRequest
       38

Oracle Sql SUM MAX

0 голосов
/ 11 февраля 2019

У меня есть следующий сценарий:

ID    Campus    Credit_Hr
===== ======      ====           
1      MIC          3                
1      Warrens      4            
1      Online       3             
1      Online       3  
2      MIC          5
2      Warrens      3
2      Online       6
3      Online       3
3      Online       3
3      West         2
4      Warrens      3
4      MIC          3
4      West         7
5      Online       3
5      West         3
5      East         3

Уоррены и MIC являются основными кампусами.Таким образом, когда Уорренс и MIC имеют равные кредитные часы, как в ID 4, выбирают либо Warrens / MIC

  • Для ID 1: Warrens> MIC, выбирают Warrens, хотя sum (Online) = 6 и больше
  • Для ID 2: MIC> Уорренс, выбрал MIC
  • Для ID 3: нет крупного кампуса (Уорренс / MIC), поэтому выбрал max credit hr.Максимальная сумма (онлайн) максимальная, поэтому выберите Онлайн
  • Для ID 5: Запад / Восток / Онлайн все являются второстепенными кампусами, поэтому выберите любой из них.

В реальности существует более 50 кампусов.

Ответы [ 2 ]

0 голосов
/ 11 февраля 2019

Если все, что вам нужно, это выбрать максимальное количество кредитных часов для каждого идентификатора, но таким образом, чтобы при наличии кредитных часов для «MIC» или «Warrens» для данного идентификатора, все остальные кампусы для того же идентификатора должны бытьигнорируется, тогда наиболее эффективным способом является использование агрегатной функции FIRST, например, так:

with
  sample_data(id, campus, credit_hr) as (
    select 1, 'MIC'    , 3 from dual union all
    select 1, 'Warrens', 4 from dual union all
    select 1, 'Online' , 3 from dual union all
    select 1, 'Online' , 3 from dual union all
    select 2, 'MIC'    , 5 from dual union all
    select 2, 'Warrens', 3 from dual union all
    select 2, 'Online' , 6 from dual union all
    select 3, 'Online' , 3 from dual union all
    select 3, 'Online' , 3 from dual union all
    select 3, 'West'   , 2 from dual union all
    select 4, 'Warrens', 3 from dual union all
    select 4, 'MIC'    , 3 from dual union all
    select 4, 'West'   , 7 from dual union all
    select 5, 'Online' , 3 from dual union all
    select 5, 'West'   , 3 from dual union all
    select 5, 'East'   , 3 from dual
)
select   id, 
         max(credit_hr) keep (dense_rank first 
             order by case when campus in ('MIC', 'Warrens') then 0 end)
         as max_hr
from     sample_data
group by id
order by id
;

   ID             MAX_HR
----- ------------------
    1                  4
    2                  5
    3                  3
    4                  3
    5                  3

Вы также можете изменить запрос (добавить больше столбцов), чтобы показать, был ли максимум из основного кампуса (чтоесли у этого удостоверения были ЛЮБЫЕ кредитные часы из одного из крупных кампусов), и / или чтобы показать, в каком кампусе было максимальное количество часов для этого идентификатора (или одного из кампусов, если в течение большинства часов была связь).

0 голосов
/ 11 февраля 2019

Назначьте информацию о крупных кампусах, затем используйте этот столбец для заказа, в дополнение к сумме часов:

dbfiddle demo

select * 
  from (
    select a.*, row_number() over (partition by id order by major, sm desc) rn
      from (
        select id, campus, 
               case when campus in ('MIC', 'Warrens') then 1 else 2 end major, 
               sum(credit_hr) over (partition by id, campus) sm
          from t) a)
  where rn = 1
...