0

主キーpkとnull許容列があるとしますcol。ランレングスの降順で、でcolある行の連続シーケンスを検索したいと思います。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 に答える