如何在MySQL中计算NULL的运行长度?

CJ *_*net 0 mysql sql

假设我有一个主键pk和一个可空列col.我想找个地方行的连续序列colNULL,在降行程的顺序进行排序.

我将接受一个只返回运行长度的查询作为一个有效的答案,但在将来(可能在一个单独的问题中)我想知道一些pk指向每个运行的起点或终点的.

示例数据:

pk    col
--    ---
1     'a'
2     NULL
3     'b'
4     NULL
5     NULL
6     NULL
7     'c'
8     NULL
9     NULL
10    'd'
Run Code Online (Sandbox Code Playgroud)

预期的查询结果:

runlengths
----------
3
2
1
Run Code Online (Sandbox Code Playgroud)

如果可能,我更喜欢标准SQL,但这是用于分析存储在MySQL中的生产数据集,因此无论在该上下文中哪种方法效果最好.

And*_*nov 6

试试这个.

DECLARE @a TABLE (
    pk INT IDENTITY(1,1),
    col CHAR(1)
)

INSERT @a (col)
VALUES  ('a'), (null), ('b'), (null), (null), (null), ('c'), (null), (null), ('d')

SELECT COUNT(*) as runlengths 
FROM @a AS A
INNER JOIN (
    SELECT 
        l.pk, 
        MAX(r.pk) AS prev
    FROM @a AS l
    INNER JOIN @a AS r
        ON l.pk > r.pk
    WHERE 
        l.col IS NOT NULL
        AND r.col IS NOT NULL
    GROUP BY 
        l.pk
) AS B
    ON A.pk < B.pk AND A.pk > B.prev
GROUP BY 
    B.pk
Run Code Online (Sandbox Code Playgroud)

这是T-SQL方言,但我相信它已经足够清楚了.

如果第一行/最后一行具有NULL值,则此查询存在问题,但要解决此问题并不困难.如何做到这一点取决于您的要求.