计算给定值的当前和最长条纹

问题描述 投票:0回答:1

我有2个表Person(ID,NAME,CLAN_ID)和DailyScore(PERSON_ID,CLAN_ID,DAY_NUMBER,SCORE)。

SCORE可以采用值“ A”,“ B”,“ C”或“-”(“-”表示不存在。)

对于给定的CLAN_ID,我需要进行2个单独的查询才能获得:

  • 每个人的给定分数(例如,A)的当前连胜和该人的姓名,按连胜长度DESC排序
  • [每个人和给定人名的给定分数(例如A)的最长连胜,按连胜长度DESC排序

一个重要的约束是忽略“-”分数,因为它们代表缺勤,而不是实际成绩。

示例数据:

餐桌人:

_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            -

所需的结果示例1(CLAN_ID = 11,SCORE = A):

当前连胜:

Alice   2
John    1

最长的连胜:

John    3
Alice   2

所需结果示例2(CLAN_ID = 12,SCORE = A):

当前连胜:

Sara    1*
Bob     0

*由于忽略了“-”,Sara当前的成绩为1 A分数

最长的连胜:

Bob     4
Sara    1
sql sqlite
1个回答
0
投票

第一个查询可以是:

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
© www.soinside.com 2019 - 2024. All rights reserved.