我有一个包含以下各列的表:

id int(10)
user int(10)
winner int(10)
profit double
created datetime


Winner列可以是0或1。我想创建一个查询,该查询返回按创建的datetime列以及第一个和最后一个创建的日期以及利润列之和排序的连续最大赢家数从那段连续的获胜者开始。

最佳答案

这是一个可能的解决方案,用于查看每个用户ID的获胜条纹。

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


这两个“ heads”子查询是相同的,您可以将它们放在支持它们的视图或WITH中。 “头”子查询搜索连胜的每个头;也就是说,第一个胜利或失败之前的胜利。我假设您的ID随着时间的推移而增加,所以我不使用“创建的”列。

下面的查询在每一行的相应标题中进行搜索。标头的ID必须小于或等于当前行的ID,并且中间不得有其他标头。

之后,只需简单地将头分组,然后将利润相加并计算行数即可。

关于sql - 查询具有某些特征的连续行,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/862594/

10-11 02:48