我不知道该怎么写标题 我有这样的表:
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
答案 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;