Самая длинная длина самого последовательного числа, которое больше нуля в серии - PullRequest
0 голосов
/ 27 мая 2019

Я хочу написать запрос t-sql, который вернет самую длинную длину наиболее последовательного числа, которое больше нуля в серии, например: у меня есть следующий набор данных

create table samples(
  id int, 
  num1 int, num2 int, num3 int, num4 int, num5 int, 
  num6 int, num7 int, num8 int, num9 int, num10 int
);
insert into samples values
  (1, 1, 1 , 0, 0 , 0, 1, 1 , 1 , 0 , 0 ),
  (2, 1, 1 , 1, 1 , 0, 1, 1 , 1 , 0 , 0 ),
  (3, 0, 1 , 1, 0, 0, 1, 1 , 1 , 0 , 0 );

Данные представляют активациюпо месяцам. (на 10 месяцев).Я хотел бы получить самый длинный активный период времени через 10 месяцев.
Для id=1 есть два 1 в начале и три 1 после нескольких нулей, для этого идентификатора я хотел бы получить три как результат.Для id=2 есть четыре 1 в начале и три 1 после нуля, для этого идентификатора I, я хотел бы получить 4 в качестве результата.И за id = 3 я бы тоже хотел получить 3.И поскольку максимальное значение равно 1 последовательно, оно встречается в двух разных последовательных местах, и первое имеет длину 2, а второе - 3.

1 Ответ

3 голосов
/ 27 мая 2019

Один из вариантов - объединить строку из 1 и 0, а затем использовать string_split() в нуле, чтобы получить максимальную длительность

Это предполагает нули. Если используются другие значения, можно использовать sign(num1) или даже left(num1,1)

Пример

Select A.ID
      ,MaxLen = max(len(B.value))
 From samples A
 Cross Apply string_split(concat(num1,num2,num3,num4,num5,num6,num7,num8,num9,num10),'0') B
 Group By ID

Возвращает

ID  MaxLen
1   3
2   4
3   3

РЕДАКТИРОВАТЬ - Возможно, более совершенная версия

Select A.ID
      ,B.MaxLen
 From samples A
 Cross Apply (Select MaxLen = max(len(value)) 
               From  string_split(concat(num1,num2,num3,num4,num5,num6,num7,num8,num9,num10),'0') 
             ) B
...