2017-02-17 77 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