Compute Un compte courant des valeurs non nulles avec une fonction de fenêtre pour former des groupes, puis 2 deux chefs d'accusation imbriqués ...
SELECT x, count(*) AS y
FROM (
SELECT grp, count(*) FILTER (WHERE g IS NULL) AS x
FROM (
SELECT g, count(g) OVER (ORDER BY n) AS grp
FROM tbl
) sub1
WHERE g IS NULL
GROUP BY grp
) sub2
GROUP BY 1
ORDER BY 1;
count()
ne compte que des valeurs non nulles.
Ceci inclut la ligne précédente avec une valeur non nulle g
dans le groupe suivant (grp
) de valeurs NULL - qui doit être supprimée du nombre.
J'ai remplacé la clause HAVING
que j'avais pour cela dans ma requête initiale avec WHERE g IS NULL
, comme @klin uses in his answer), c'est plus simple.
connexes:
Sin
est une séquence gapless des nombres entiers, vous pouvez simplifier:
SELECT x, count(*) AS y
FROM (
SELECT grp, count(*) AS x
FROM (
SELECT n - row_number() OVER (ORDER BY n) AS grp
FROM tbl
WHERE g IS NULL
) sub1
GROUP BY 1
) sub2
GROUP BY 1
ORDER BY 1;
Éliminez pas les valeurs NULL immédiatement et déduisent le numéro de ligne de n
, arrivant ainsi à (sans signification) les numéros de groupe directement ...
Alors que la seule valeur possible g
est 1
, sum()
est un truc intelligent (like @klin provided). Mais cela devrait être une colonne boolean
alors, n'aurait pas de sens en tant que type numérique. Donc, je suppose que c'est juste une simplification du problème réel dans la question.
Cela a été très utile, merci –