假设我有一个主键pk
和一个可空列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中的生产数据集,因此无论在该上下文中效果最好。
答案 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。