Voici une solution possible qui examine les séquences gagnantes par ID utilisateur.
select head.userid, head.id, sum(profit), count(*)
from #bingo b
inner join (
select cur.userid, cur.id
from #bingo cur
left join #bingo prev
on cur.userid = prev.userid
and prev.id < cur.id
and not exists(
select *
from #bingo inbetween
where prev.userid = inbetween.userid
and prev.id < inbetween.id
and inbetween.id < cur.id)
where cur.winner = 1
and IsNull(prev.winner,0) = 0
) head
on head.userid = b.userid
and head.id <= b.id
left join (
select cur.userid, cur.id
from #bingo cur
left join #bingo prev
on cur.userid = prev.userid
and prev.id < cur.id
and not exists(
select *
from #bingo inbetween
where prev.userid = inbetween.userid
and prev.id < inbetween.id
and inbetween.id < cur.id)
where cur.winner = 1
and IsNull(prev.winner,0) = 0
) nexthead
on nexthead.userid = b.userid
and head.id < nexthead.id
and nexthead.id <= b.id
where nexthead.id is null
and b.winner = 1
group by head.userid, head.id
Les deux « têtes » sont identiques sous-requêtes, vous pouvez les mettre dans une vue ou WITH où ceux-ci sont pris en charge. La sous-requête "heads" recherche chaque tête d'une série de victoires; c'est-à-dire, la première victoire ou une victoire qui est précédée d'une perte. Je suppose que votre identifiant augmente au fil du temps, donc je n'utilise pas la colonne Créé.
La requête ci-dessous qui recherche la tête correspondante pour chaque ligne. L'identifiant d'une tête doit être plus petit ou égal à l'identifiant de la ligne en cours, et il ne doit pas y avoir d'autre tête entre les deux. Ensuite, c'est une simple question de regroupement sur la tête, de sommation des profits et de comptage des rangées.
Êtes-vous à la recherche de gagnants consécutifs avec le même utilisateur? Ou juste des victoires consécutives? – Andomar
L'un ou l'autre, mais j'espère que la solution peut implémenter l'un ou l'autre. – Dave