我有2个表Person(ID,NAME,CLAN_ID)和DailyScore(PERSON_ID,CLAN_ID,DAY_NUMBER,SCORE)。
SCORE可以采用值“ A”,“ B”,“ C”或“-”(“-”表示不存在。)
对于给定的CLAN_ID,我需要进行2个单独的查询才能获得:
一个重要的约束是忽略“-”分数,因为它们代表缺勤,而不是实际成绩。
餐桌人:
_ID NAME CLAN_ID
1 John 11
2 Alice 11
3 Bob 12
4 Sara 12
[Table DailyScore:
PERSON_ID CLAN_ID DAY_NUMBER SCORE
1 11 1 A
1 11 2 A
1 11 3 A
1 11 4 C
1 11 5 A
2 11 1 B
2 11 2 C
2 11 3 B
2 11 4 A
2 11 5 A
3 12 1 A
3 12 2 A
3 12 3 A
3 12 4 A
3 12 5 B
4 12 1 C
4 12 2 B
4 12 3 C
4 12 4 A
4 12 5 -
当前连胜:
Alice 2
John 1
最长的连胜:
John 3
Alice 2
当前连胜:
Sara 1*
Bob 0
*由于忽略了“-”,Sara当前的成绩为1 A分数
最长的连胜:
Bob 4
Sara 1
第一个查询可以是:
select
id, name, max(s) as streak
from (
select
p.id,
p.name,
count(*) over(partition by p.id order by s.day_number desc) as c,
sum(case when s.score = 'A' then 1 else 0 end)
over(partition by p.id order by s.day_number desc) as s
from person p
join dailyscore s on s.person_id = p.id
) x
where c = s