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

时间:2012-04-08 18:29:14

标签: 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'

预期查询结果:

runlengths
----------
3
2
1

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

2 个答案:

答案 0 :(得分: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

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

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

答案 1 :(得分:3)

尝试一下:

select count(*) runlengths from (
  select col, @count := @count + (col is not null) cnt
  from t, (select @count := 0) init
) final
where col is null
group by cnt
order by count(*) desc

小提琴here