【问题标题】:The longest length of most consecutive number which is bigger than zero in a series一个序列中大于零的最大连续数的最长长度
【发布时间】:2019-10-13 04:02:35
【问题描述】:

我想写一个 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,我希望得到三个作为结果。 对于id=2,开头有四个 1,零后有三个 1,对于这个 id,我希望得到 4 作为结果。 对于id = 3,我也想获得 3 个。 而且由于最大值是 1 串联,它出现在两个不同的连续位置,第一个长度为 2,第二个为 3。

【问题讨论】:

  • 尝试反透视列(使用 UNPIVOT),然后使用运行总和(使用 SUM ... OVER)来查找最长的周期。

标签: arrays sql-server tsql series


【解决方案1】:

一种选择是将一串 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

【讨论】:

  • 非常漂亮,我喜欢!
猜你喜欢
  • 2019-08-22
  • 2015-02-03
  • 2016-11-04
  • 1970-01-01
  • 2023-03-27
  • 2011-12-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多