Sql选择按最新日期记录并由此决定

时间:2014-11-26 11:39:13

标签: sql sql-server tsql row-number

我不知道该怎么写标题 我有这样的表:

RegistrationNumber- Class- Score- Session Date - Session Time
2000905         | Class1  | 80    |2014-07-13|  10:00-13:00 
2000019         | Class1  | 70    |2014-07-19|  15:00-18:00
2000007         | Class1  | 70    |2014-07-18|  10:00-13:00 
2000007         | Class1  | 70    |2014-07-14|  15:00-18:00 
2000007         | Class1  | 70    |2014-07-11|  10:00-13:00 
2000907         | Class2  | Null  |2014-07-12|  15:00-18:00
2000006         | Class2  | 34    |2014-07-13|  10:00-13:00 
2005612         | Class2  | 55    |2014-07-14|  15:00-18:00 
2000919         | Class2  | 65    |2014-07-15|  11:00-12:00 
2001034         | Class2  | 29    |2014-07-14|  11:00-12:00 
2000000         | Class2  | 45    |2014-07-14|  11:00-12:00 
2000000         | Class2  | 45    |2014-07-14|  15:00-18:00 
2000000         | Class2  | 45    |2014-07-15|  10:00-13:00
2001029         | Class2  | Null  |2014-07-17|  10:00-13:00 

我想编写一个带有数据的SQL,如下所示 这个想法是按RegistrationNumber,Class,SessionDate,SessionTime排序,然后是有分数的人 然后是一个会议,但Y(是)出席。如果同一个人有超过1个会话 同一个类然后它应该只为最新的会话放Y,而前面的那个应该是No

RegistrationNumber- Class- Score- Session Date - Session Time -Attendance   

2000000         | Class2  | 45    |2014-07-14|  11:00-12:00 |   N           
2000000         | Class2  | 45    |2014-07-14|  15:00-18:00 |   N           
2000000         | Class2  | 45    |2014-07-15|  10:00-13:00 |   Y           
2000007         | Class1  | 70    |2014-07-11|  10:00-13:00 |   N           
2000007         | Class1  | 70    |2014-07-14|  15:00-18:00 |   N           
2000007         | Class1  | 70    |2014-07-18|  10:00-13:00 |   Y           
2000006         | Class2  | 34    |2014-07-13|  10:00-13:00 |   Y           
2000019         | Class1  | 70    |2014-07-19|  15:00-18:00 |   Y           
2000905         | Class1  | 80    |2014-07-13|  10:00-13:00 |   Y           
2000907         | Class2  | Null  |2014-07-12|  15:00-18:00 |   N          
2000919         | Class2  | 65    |2014-07-15|  11:00-12:00 |   Y           
2001029         | Class2  | Null  |2014-07-17|  10:00-13:00 |   N          
2001034         | Class2  | 29    |2014-07-14|  11:00-12:00 |   Y           
2005612         | Class2  | 55    |2014-07-14|  15:00-18:00 |   Y       

2 个答案:

答案 0 :(得分:3)

这是一个想法。使用窗口函数获取所需信息。然后在case语句中使用它们。我认为逻辑是:

select RegistrationNumber, Class, Score, SessionDate, SessionTime,
       (case when score is not null and cnt = 1 then 'Y'
             when cnt > 1 and seqnum = cnt then 'Y'
             else 'N'
        end) as Attendance
from (select t.*,
             row_number() over (partition by RegistrationNumber, Class
                                order by SessionDate, SessionTime) as seqnum,
             count(*) over (partition by RegistrationNumber, Class) as cnt
      from table t
     ) t
order by RegistrationNumber, Class, SessionDate, SessionTime;

答案 1 :(得分:1)

只是为了展示一个替代戈登的答案:你想要每个注册号码和课程的最后记录,并使其成为一个' Y' (只要有分数)。所以这是反向顺序中的第一个。因此,使用相反顺序的row_number来确定第一个或最后一个记录: - )

select
  registrationnumber, class, score, session_date, session_time,
  case when score > 0 and row_number() over (
                           partition by registrationnumber, class 
                           order by session_date desc, session_time desc) = 1 then
    'Y'
  else
    'N'
  end as attendance 
from mytable
order by registrationnumber, class, session_date, session_time;