2012-04-08 3 views
0

Предположим, у меня есть первичный ключ pk и нулевая колонка col. Я хочу найти последовательные последовательности строк, где col - NULL, упорядоченный в порядке убывания длины пробега.Как подсчитать длины выполнения NULL в MySQL?

Я буду принимать в качестве действительного ответа запрос, который возвращает длины выполнения в одиночку, но в будущем (возможно, в отдельном вопросе) мне нужно знать некоторые 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

Возможно, слишком поздно для изменения, но для дальнейшего использования вам было бы лучше использовать базу данных, которая поддерживает стандартные аналитические функции SQL (т. Е. Почти все, кроме MySQL). –

+0

Yup! В этом случае я был полностью вне моего контроля, но для своих проектов я буду помнить ваш совет. –

ответ

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, но нетрудно это исправить. Способ, как это сделать, зависит от ваших требований.

+0

это не сработало для меня –

+0

и что случилось? –

+0

не возвращает мне результат –

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.

Смежные вопросы