假设我有一个主键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'
Run Code Online (Sandbox Code Playgroud)
预期的查询结果:
runlengths
----------
3
2
1
Run Code Online (Sandbox Code Playgroud)
如果可能,我更喜欢标准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
Run Code Online (Sandbox Code Playgroud)
这是T-SQL方言,但我相信它已经足够清楚了.
如果第一行/最后一行具有NULL值,则此查询存在问题,但要解决此问题并不困难.如何做到这一点取决于您的要求.