Как вычислить самую длинную и последнюю выигрышную серию без разрыва в дате

#sql #sql-server #sql-server-2008

#sql #sql-сервер #sql-server-2008

Вопрос:

Я хочу вычислить самую длинную и последнюю выигрышную серию без разрыва в дате. Я использую SQL Server 2008. У меня есть структура таблицы, подобная этой:

 Date       Result  Value   
2014-01-14  W   1800
2014-10-08  L   900
2014-10-17  L   900
2015-04-15  L   900
2015-07-23  W   1800
2016-01-04  L   900
2016-05-31  L   195
2016-06-01  W   6351
2016-06-02  W   10500
2016-06-03  L   312
2016-06-14  W   14091
2016-06-27  W   3360
2016-07-11  W   4320
2016-07-12  W   55596
2016-07-13  W   14403
2016-08-04  W   86399
2016-09-13  L   356
2016-10-09  W   86399
2016-10-10  W   177178
2016-10-18  W   86399
2016-10-19  W   86399
  

ВЫВОД

  Streak Total    RecordType
    2   172798   Latest             //Comments (2016-10-18,2016-10-19)
    3   74319    Longest            //Comments(2016-07-11,2016-07-12,2016-07-13)
  

Ответ №1:

Вы можете определить серию, вычитая увеличивающееся число из даты. Когда это значение постоянно, то у вас есть серия:

 select min(date) as winning_streak_start, count(*) as num_days, sum(value) as total
from (select t.*, dateadd(day, -row_number() over (order by date), date) as grp
      from t
      where result = 'W'
     ) t
group by grp;
  

Затем вы можете использовать это, чтобы получить самую длинную и самую последнюю:

 with t as (
      select min(date) as winning_streak_start, count(*) as streak, sum(value) as total
      from (select t.*, dateadd(day, -row_number() over (order by date), date) as grp
            from t
            where result = 'W'
           ) t
      group by grp
     )
select t.*
from ((select top (1) streak, total, 'Longest' as RecordType
       from t
       order by streak desc
      ) union all
      (select top (1) streak, total, 'Latest'
       from t
       order by winning_streak_start desc
      )
     ) t;