Подсчет текущих и самых длинных полос данного значения - PullRequest
0 голосов
/ 21 марта 2020

У меня есть 2 таблицы Person (ID, NAME, CLAN_ID) и DailyScore (PERSON_ID, CLAN_ID, DAY_NUMBER, SCORE).

SCORE может принимать значения "A", "B", "C "или" - "(" - "означает отсутствие).

Мне нужно сделать 2 отдельных запроса, чтобы получить для данного CLAN_ID:

  • текущую серию данного счета (скажем, A, например) для каждого Лица и его имени, упорядоченные по длине полосы DES C
  • самая длинная полоса данного результата (например, A, например) для каждого Лица и имя человека, упорядоченное по длине полосы DES C

Важным ограничением является то, что "-" СЧЕТЫ игнорируются, так как они представляют отсутствие, а не реальные Счета.

Пример данных:

Персона таблицы:

_ID  NAME    CLAN_ID
1    John    11
2    Alice   11
3    Bob     12
4    Sara    12

Таблица 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):

Текущая строка eak:

Sara    1*
Bob     0

*, поскольку "-" игнорируются, у Сары текущая полоса 1 балл

Самая длинная полоса из всех:

Bob     4
Sara    1

Редактировать:

Если это поможет, вот этот пример в SQL Fiddle: http://sqlfiddle.com/#! 7 / 2ed69 / 2

1 Ответ

0 голосов
/ 21 марта 2020

Первый запрос может быть:

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
group by id, name
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...