2016-02-22 223 views
1

以下是一些示例数据。我试图为每个用户标识获取最近活动日期的单个记录。如果用户观看在给定日期超过一部电影,记录应根据与电影名称相关联的优先级来选择sql根据多列选择优先级

UserID MovieName ActivityDate 
1  MOV1 2015-02-12 
2  MOV2 2015-04-22 
1  MOV3 2015-03-16 
3  MOV1 2015-06-23 
2  MOV5 2016-01-01 
2  MOVH 2016-01-01 

优先与电影名关联 -

MOV1 > MOV2 > MOV3 > MOV5 > MOVH 

预期结果:

UserID MovieName ActivityDate 
1  MOV3 2015-03-16 
2  MOV5 2016-01-01 
3  MOV1 2015-06-23 

我已经尝试了GROUP BY和CASE的组合,但我非常确定可以有更好的方法。任何帮助表示赞赏。

回答

0

正确的答案是row_number(),但你必须要小心的order by

select m.* 
from (select m.*, 
      row_number() over (partition by UserId 
           order by ActivityDate desc, 
             (case MovieName 
               when 'MOV1' then 1 
               when 'MOV2' then 2 
               when 'MOV3' then 3 
               when 'MOV5' then 4 
               when 'MOVH' then 5 
               else 999 
              end) 
           ) as seqnum 

     from movies m 
    ) m 
where seqnum = 1; 
2
select * 
from (
select * 
, row_number() OVER (partition by id order by MovieName desc, ActivityDate desc) as rnk 
from movies) m 
where m.rnk = 1