选择任意值为max
问题描述:
我有两个表,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
任何人都可以指向正确的方向吗?
答
order by
case subtype
when 'P1' then 1
when 'L1' then 2
when 'M' then 3
...
end
答
您需要使用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
@mathguy ..排序返回所有排序的记录。这将返回1行每个学生这是什么操作需要。 fyi ..我不是发布重复答案的粉丝,我只发布这个,因为其他答案没有回答这个问题。 –
好的,我自己也得出了这个结论。 – mathguy