0

假设我有一个主键pk和一个可为空的列col。我想找到colis的连续行序列NULL,按运行长度的降序排列。

我将接受一个仅返回运行长度的查询作为有效答案,但在未来(也许在一个单独的问题中)我会想知道一些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 中的生产数据集,所以在这种情况下最适合的方法。

4

2 回答 2

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 值,但不难解决。如何做到这一点取决于您的要求。

于 2012-04-08T18:39:30.430 回答
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

在这里拉小提琴。

于 2012-04-08T18:45:13.033 回答