2017-02-17 10 views
1

У меня есть две таблицы, СТУДЕНТЫ и LOG.Выбор произвольного значения как max

В таблице LOG может быть 0 или более записей в нем для каждого учащегося. Записи в таблице LOG классифицируются по столбцу SUBTYPE. Значения для SUBTYPE: «H», «L1», «L2», «L3», «M», «P1», «P2» и «Px».

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

Я, естественно, думаю о MAX (подтип), но это не сработает, потому что я не пытаюсь выбрать фактическое максимальное буквенно-цифровое значение подтипов - я пытаюсь выбрать на основе заранее заданной «СЕВЕРНОСТИ» ». Тяжесть, BTW, не сохраняется в БД, поэтому мне нужно как-то определить это внутри запроса.

Для примера ...

STUDENTS TABLE 
ID  LAST_NAME  FIRST_NAME 
------------------------------------ 
2  Smith   John 
3  Jones   Bob 
4  Bower   Jack 


LOG TABLE 
ID  STUDENTSID  SUBTYPE 
------------------------------------ 
1  2     P1 
2  2     M 
3  2     L1 
4  3     L2 
5  3     P2 
6  3     H 

Значения подтипа на самом деле должны быть ранжированы/отсортированный как:

(From Least Severe) 
1. P1 
2. L1 
3. M 
4. L2 
5. P2 
6. H 
7. L3 
8. Px 
(To Most Severe) 

Ниже то, что мне нужен мой доклад выглядеть. Примечание. Джек Бауэр не находится в отчете, так как у него нет записей в таблице журналов.

DESIRED REPORT OUTPUT: 
John Smith --- M 
Bob Jones ---- H 

Может ли кто-нибудь указать мне в правильном направлении?

ответ

0
order by 
    case subtype 
    when 'P1' then 1 
    when 'L1' then 2 
    when 'M' then 3 
    ... 
    end 
1

Вы должны определить приоритеты подтипов соответственно с помощью row_number функции. Затем выберите первую строку для каждого ученика.

select id,first_name,last_name 
from (
select s.* 
,row_number() over(partition by s.id 
        order by case when l.subtype='P1' then 1 
           when l.subtype='L1' then 2 
           when l.subtype='M' then 3 
           when l.subtype='L2' then 4 
           when l.subtype='P2' then 5 
           when l.subtype='H' then 6 
           when l.subtype='L3' then 7 
           when l.subtype='Px' then 8 
        end desc) as rnum 
from students s 
join logs l on s.id=l.studentsid 
) x 
where rnum = 1 
+0

@mathguy .. заказ возвращает все заказы. это возвращает 1 строку на одного учащегося, что и требуется оператору. fyi..i я не поклонник публикации дубликатов ответов, и я только опубликовал это, потому что другой ответ не отвечает на вопрос. –

+0

Правильно, я сам пришел к такому выводу. – mathguy

Смежные вопросы