假设我有一个主键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中的生产数据集,所以在这种情况下效果最好。
试试这个。
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 值,则此查询存在问题,但修复起来并不难。如何做到这一点取决于您的要求。
试一试:
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
在这里摆弄。