Запросы на последовательные строки с определенными характеристиками - PullRequest
1 голос
/ 14 мая 2009

У меня есть таблица со следующими столбцами:

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

Столбец победителя может быть 0 или 1. Я хотел бы создать запрос, который возвращает максимальное число последовательных победителей в соответствии с порядком созданного столбца даты и времени, а также первую и последнюю дату создания, а также сумму столбец прибыли за этот период подряд победителей.

Ответы [ 2 ]

0 голосов
/ 14 мая 2009

Вот возможное решение, которое учитывает количество выигрышных полос для каждого идентификатора пользователя.

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

Два подзапроса "head" идентичны, вы можете поместить их в представление или в WITH, где они поддерживаются. Подзапрос «Начальники» ищет каждую главу победной серии; то есть первая победа или победа, которой предшествует проигрыш. Я предполагаю, что ваш идентификатор увеличивается с течением времени, поэтому я не использую столбец Created.

Запрос ниже, который ищет соответствующий заголовок для каждой строки. Идентификатор головы должен быть меньше или равен идентификатору текущей строки, и между ними не должно быть другой головы.

После этого просто группировать по голове, суммировать прибыль и считать строки.

0 голосов
/ 14 мая 2009

Я не проверял, но, возможно, это сработает.

    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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...