SQL найти счетчик последовательности для вида спорта - PullRequest
1 голос
/ 03 ноября 2019

Я ищу SELECT, который даст мне «счетчик последовательности». Возьмите вид спорта по вашему выбору, и я хочу знать, сколько игр у игрока есть, например, в цели (хоккей, футбол) или в хите (бейсбол).

Итак, у меня есть этот стол DaysData

INSERT @DaysData(PlayerID, GameDate, GoalsInGame)
VALUES
(100, '20180105', 0),
(100, '20180107', 1),
(100, '20180109', 1),
(100, '20180111', 2),
(100, '20180113', 1),
(100, '20180115', 0),
(100, '20180117', 0),
(100, '20180118', 1),
(100, '20180120', 1),
(100, '20180122', 3),
(100, '20180124', 2),
(100, '20180125', 1),
(100, '20180127', 0),
(100, '20180129', 0),
(100, '20180130', 1);

Итак, я хочу кое-что сказать мне: игрок 100

  • имеет последовательность из 4 игр с целью между 20180107 и 20180113 (делая 5 голов во время этой серии)
  • и последовательность из 5 игр с целью между 20180118 и 20180125 (делая 8 голов во время этой серии)
  • и, наконец, последовательность из 1 игры с целью между 20180130 и 20180130
    CountGameSequence , DateFrom ,  DateTo 
    4 ,                 20180107 , 20180113 
    5 ,                 20180118 , 20180125
    1 ,                 20180130 , 20180130

Я пробую много вещей с LEAD, LAG, RowNumber () и т. Д. ... Я никогда не нахожу способ получить хороший запрос.

1 Ответ

3 голосов
/ 03 ноября 2019

Это проблема пробелов и островков. В вашем случае, я думаю, что разница в количестве строк работает хорошо:

select playerid, min(gamedate), max(gamedate), count(*) as sequence_length
from (select dd.*,
             row_number() over (partition by playerid order by gamedate) as seqnum,
             row_number() over (partition by playerid, sign(goalsingame) order by gamedate) as seqnum_2
      from @DaysData dd
     ) dd
where goalsingame > 0
group by playerid, (seqnum - seqnum_2)
order by sequence_length desc;

Один трюк с этим заключается в использовании sign() для захвата игр, в которых у игрока есть результат. Это удобство. Код (case when goalsingame > 0 then 1 else 0 end) будет делать то же самое.

Почему это работает? Это немного сложно объяснить. Тем не менее, я обнаружил, что если вы посмотрите на результаты подзапроса, вы быстро увидите, как разница в двух порядковых номерах идентифицирует соседние значения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...