2017-02-17 74 views
1

我有两个表,STUDENTS和LOG。选择任意值为max

LOG表中每个学生可能有0个或更多记录。 LOG表中的记录按列SUBTYPE分类。 SUBTYPE的值为:'H','L1','L2','L3','M','P1','P2'和'Px'。

我想制作一份报告,列出每个学生的姓名一次,以及最严重的的LOG表中的代码。

我自然会想到MAX(子类型),但这不起作用,因为我没有试图选择子类型的实际最大字母数字值 - 我试图根据预定义的“SEVERITY ”。严重性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) 

下面是什么,我需要我的报告的样子。请注意,Jack Bower不在报告中,因为他在日志表中没有任何记录。

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 ..我不是发布重复答案的粉丝,我只发布这个,因为其他答案没有回答这个问题。 –

+0

好的,我自己也得出了这个结论。 – mathguy