Hier ist eine mögliche Lösung, die Gewinnsträhne pro Benutzerid betrachtet.
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
Die beiden „Köpfe“ Unterabfragen sind identisch, können Sie sie in einer Ansicht oder ein MIT, wo diejenigen unterstützt werden, setzen könnte. Die "Kopf" -Unterabfrage sucht nach jedem Kopf einer Gewinnserie; das ist der erste Sieg oder ein Sieg, dem ein Verlust vorausgeht. Ich gehe davon aus, dass Ihre ID im Laufe der Zeit zunimmt. Daher verwende ich nicht die Spalte "Erstellt".
Die folgende Abfrage durchsucht den entsprechenden Kopf für jede Zeile. Die ID eines Kopfes muss kleiner oder gleich der ID der aktuellen Zeile sein, und es darf keinen anderen Kopf dazwischen geben.
Danach ist es eine einfache Sache der Gruppierung auf dem Kopf, und summiert die Gewinne und das Zählen der Zeilen.
Suchen Sie nach aufeinanderfolgenden Gewinnern mit demselben Benutzer? Oder nur aufeinander folgende Siege? – Andomar
Entweder man, aber hoffentlich kann die Lösung beide implementieren. – Dave