Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/76.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/67.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 查询具有特定特征的连续行_Sql_Mysql - Fatal编程技术网

Sql 查询具有特定特征的连续行

Sql 查询具有特定特征的连续行,sql,mysql,Sql,Mysql,我有一个包含以下列的表: id int(10) user int(10) winner int(10) profit double created datetime 获胜者列可以是0或1。我想创建一个查询,返回created datetime列排序的最大连续赢家数,以及第一个和最后一个创建日期,以及该连续赢家期间利润列的总和。我还没有测试它,但这可能会起作用 select first_winner.created, last_winner.created, sum(mid_winner

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

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

获胜者列可以是0或1。我想创建一个查询,返回created datetime列排序的最大连续赢家数,以及第一个和最后一个创建日期,以及该连续赢家期间利润列的总和。

我还没有测试它,但这可能会起作用

    select first_winner.created, last_winner.created, sum(mid_winner.profit)
          from T first_winner
     join T last_winner
          on first_winner.created <= last_winner.created
          and first_winner.winner = 1
          and last_winner.winner = 1
          and not exists -- no losers in between first_winner and last_winner
          (
           select * from T loser
           where loser.winner = 0
            and first_winner.created <= loser.created 
                                    and loser.created <= last_winner.created
          )
     join T mid_winner
          on first_winner.created <= mid_winner.created
                                 and mid_winner.created <= last_winner.created
          and mid_winner.winner = 1
     left join T bef_first_winner  -- winner before first winner with no losers in between
          on bef_first_winner.winner = 1
          and bef_first_winner.created < first_winner.created
          and not exists
          ( 
           select * from T b_loser
           where b_loser.winner = 0
            and bef_first_winner.created <= b_loser.created 
               and b_loser.created <= first_winner.created
          )
     left join T after_last_winner -- winner after last winner with no losers in between
          on after_last_winner.winner = 1
          and last_winner.created < after_last_winner.created
          and not exists
          ( 
           select * from T a_loser
           where a_loser.winner = 0
            and last_winner.created <= a_loser.created 
               and a_loser.created <= after_last_winner.created
          )
    where bef_first_winner.id is null
        and after_last_winner.id is null
   group by first_winner.created, last_winner.created

这里有一个可能的解决方案,可以查看每个用户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 
这两个子查询是相同的,您可以将它们放在支持它们的视图或视图中。heads子查询搜索连胜的每个head;也就是说,第一场胜利或先赢后输。我假设您的id随着时间的推移而增加,所以我不使用创建的列

下面的查询将搜索每行对应的标题。头的id必须小于或等于当前行的id,并且中间不能有其他头


在这之后,只需对头部进行分组,然后对利润进行求和并计算行数。

我得到:错误114042000:混合组列MIN、MAX、COUNT,。。。如果没有GROUP BY子句,则with NOT GROUP列是非法的。我忘记了GROUP子句是由GROUP BY子句执行的,它仍然在运行。已经有几个小时了-您是否在寻找同一用户的连续获奖者?或者仅仅是连续的胜利?任何一个,但希望解决方案可以实现任何一个。我明白你的意思,但我使用的是mysql,它不喜欢with语句:ERROR 1064 42000:你的SQL语法有错误;检查与您的MySQL服务器版本对应的手册,以获得正确的语法,以便在不使用now的情况下使用near'with heads。为了提高性能,请检查id上是否有主键,useridIsNullprev上是否有索引。winner,0=0在mySQL中不起作用。它可以被改写成mySQL,改为IsNullprev.winner=1。我试着在一个有200万行的表上这样做,基本上我等待结果的时间太长了。
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