有没有办法在 SQL 的列中获得 1 的最大连续计数?

Is there a way to get max consecutive counts of 1s across columns in SQL?

有没有办法获得 SQL 中各列的最大连续计数?我正在寻找最长的生存时间。

例如,如果我有一个看起来像这样的数据集

ID  T1  T2  T3  T4  T5  T6  T7  T8  T9
1   1   1   0   0   0   1   1   1   1
2   0   0   0   1   1   1   1   1   0
3   0   1   0   1   0   1   1   0   0
4   0   1   0   0   0   0   0   0   0
5   0   1   1   0   0   0   0   0   0
6   1   0   1   1   0   1   1   1   0

我想添加一列以获取 T1-T9 列中的最大连续 1,因此它看起来像这样

ID  T1  T2  T3  T4  T5  T6  T7  T8  T9  MAX
1   1   1   0   0   0   1   1   1   1   4
2   0   0   0   1   1   1   1   1   0   5
3   0   1   0   1   0   1   1   0   0   2
4   0   1   0   0   0   0   0   0   0   1
5   0   1   1   0   0   0   0   0   0   2
6   1   0   1   1   0   1   1   1   0   3

我认为 proc sql 中最简单的方法可能是蛮力方法:

select t.*,
       (case when t1||t2||t3||t4||t5||t6||t7||t8||t9 like '%111111111%' then 9
             when t1||t2||t3||t4||t5||t6||t7||t8||t9 like '%11111111%' then 8
             when t1||t2||t3||t4||t5||t6||t7||t8||t9 like '%1111111%' then 7
             when t1||t2||t3||t4||t5||t6||t7||t8||t9 like '%111111%' then 6
             when t1||t2||t3||t4||t5||t6||t7||t8||t9 like '%11111%' then 5
             when t1||t2||t3||t4||t5||t6||t7||t8||t9 like '%1111%' then 4
             when t1||t2||t3||t4||t5||t6||t7||t8||t9 like '%111%' then 3
             when t1||t2||t3||t4||t5||t6||t7||t8||t9 like '%11%' then 2
             when t1||t2||t3||t4||t5||t6||t7||t8||t9 like '%1%' then 1
             else 0
        end) as max
from t;

Here 是一个 db<>fiddle 说明使用 Postgres 的逻辑。

**下面的代码是一种在 MySQL 中获取跨列最大连续计数的方法我想你想要跨行 **

create table t(id integer,t1 integer,t2 integer,t3 integer,t4 integer,t5 integer,t6 integer,t7 integer,t8 integer,t9 integer);
insert into t values(1,1,0,1,0,1,1,0,0,0),(2,0,0,1,1,1,0,0,0,0),(3,1,0,1,1,1,1,0,0,0);

WITH CTE1 AS
( 
       SELECT id , ROW_NUMBER() OVER (ORDER BY id) Rnk FROM t 
)
,CTE2 AS
(
       SELECT *,  CASE WHEN id-1 = LAG(id) OVER(ORDER BY rnk) THEN 0
       ELSE 1 END cols FROM CTE1 c2
)
,CTE3 AS
(
       SELECT *,  SUM(cols) OVER(ORDER BY rnk) Grouper FROM CTE2 c2
)
SELECT *  FROM
(
    SELECT COUNT(*) Counts FROM CTE3 GROUP BY Grouper  
)r
ORDER BY Counts DESC ;