Как выбрать RANK сверх условия (зависит от предыдущей строки) - PullRequest
0 голосов
/ 15 апреля 2020

Что у нас есть

У меня есть такая таблица


id          PlayerId    Amount
----------- ----------- -----------
1           1           10
2           1           20
3           1           30
4           1           40
5           1           40
11          1           20
13          1           20
15          1           40
14          2           19
12          2           10
6           2           1
7           2           5
8           2           10
9           2           20
10          2           30

Мне нужно выбирать только те строки, сумма которых больше, чем сумма предыдущих строк (на игрока).

Итак, вот запрос

SELECT a.id,
       a.PlayerId,
       a.Amount,
       a.PreVval,
       a.NextVal
 FROM (SELECT id,
       PlayerId,
       Amount,
       LAG(Amount) OVER (PARTITION BY PlayerId ORDER BY id) PreVval,
       lead(Amount) OVER (PARTITION BY PlayerId ORDER BY id) NextVal
       FROM dbo.Bets ) a 
       WHERE a.Amount > a.PreVval OR a.Amount < a.NextVal OR (a.PreVval IS NULL AND a.Amount < a.NextVal)

ORDER BY a.PlayerId, a.id
id          PlayerId    Amount      PreVval     NextVal
----------- ----------- ----------- ----------- -----------
1           1           10          NULL        20
2           1           20          10          30
3           1           30          20          40
4           1           40          30          40
13          1           20          20          40
15          1           40          20          NULL
6           2           1           NULL        5
7           2           5           1           10
8           2           10          5           20
9           2           20          10          30
10          2           30          20          10
12          2           10          30          19
14          2           19          10          NULL

Вопрос

Так что теперь мне нужно выбрать наборы, где увеличение количества шагов> 4, я имею в виду 1,2,3,4 для игрока 1 и 6,7,8,9,10 для игрока 2

Запрос должен проходить через 15 м рядов

Ответы [ 2 ]

0 голосов
/ 15 апреля 2020

Следующий запрос является примером, в котором вы можете установить "step_count".

WITH Bets(id,PlayerId,Amount)
AS
(
SELECT 1,1,10 UNION ALL
SELECT 2,1,20 UNION ALL
SELECT 3,1,30 UNION ALL
SELECT 4,1,40 UNION ALL
SELECT 5,1,40 UNION ALL
SELECT 11,1,20 UNION ALL
SELECT 13,1,20 UNION ALL
SELECT 15,1,40 UNION ALL
SELECT 14,2,19 UNION ALL
SELECT 12,2,10 UNION ALL
SELECT 6,2,1 UNION ALL
SELECT 7,2,5 UNION ALL
SELECT 8,2,10 UNION ALL
SELECT 9,2,20 UNION ALL
SELECT 10,2,30
)
,split_ranges
as(
select *,case when lag(amount) over(partition by playerid order by id) > amount
               or lag(amount) over(partition by playerid order by id) is null 
              then row_number() over(partition by playerid order by id)
          end as rnk_val
  from bets
   )
,groups_data
 as(
select *
       ,max(rnk_val) over(partition by playerid order by id) as fill_ranges
 from split_ranges
   )
select * from (   
select *,count(*) over(partition by playerid,fill_ranges) as cnt
  from groups_data
   )x
where x.cnt>=4   

https://dbfiddle.uk/?rdbms=sqlserver_2019&fiddle=6bd815da2cbfa8f65bc999e5736f2041

0 голосов
/ 15 апреля 2020

Следующий лог c немного хитрый, но вы можете проверить это -

ДЕМО ЗДЕСЬ

WITH CTE
AS
(
    SELECT * FROM
    (
        SELECT id,
        PlayerId,
        Amount,
        LAG(Amount) OVER (PARTITION BY PlayerId ORDER BY id) PreVval,
        lead(Amount) OVER (PARTITION BY PlayerId ORDER BY id) NextVal,

        ISNULL(LAG(ID,3) OVER (PARTITION BY PlayerId ORDER BY id),0) LAG3,
        ISNULL(LAG(ID,2) OVER (PARTITION BY PlayerId ORDER BY id),0) LAG2,
        ISNULL(LAG(ID,1) OVER (PARTITION BY PlayerId ORDER BY id),0) LAG1,

        ISNULL(LEAD(ID,1) OVER (PARTITION BY PlayerId ORDER BY id),0) LEAD1,
        ISNULL(LEAD(ID,2) OVER (PARTITION BY PlayerId ORDER BY id),0) LEAD2,
        ISNULL(LEAD(ID,3) OVER (PARTITION BY PlayerId ORDER BY id),0) LEAD3
        FROM Bets 
    ) a 
    WHERE a.Amount > a.PreVval 
    OR a.Amount < a.NextVal 
    OR (a.PreVval IS NULL AND a.Amount < a.NextVal)
)

SELECT id,PlayerId,Amount,PreVval,NextVal
FROM CTE A
WHERE ID-LAG3 = 3
OR LEAD1 - LAG2 = 3 
OR LEAD2 - LAG1 = 3
OR LEAD3 - ID = 3
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...