sql разница между строками где указано - PullRequest
0 голосов
/ 15 марта 2019

Марка Spanking Новое в использовании SQL (действительно в него!) У меня есть собственная база данных и таблица

Time   Team    Win/loss
5:00   Red     Win
5:30   Red     Loss
6:00   Red     Loss
6:30   Red     Loss
7:00   Red    Loss
7:30  Red      Win
8:00   Red     Win

Я хотел бы запросить это, чтобы показать количество «игр», которое потребовалось между каждым выигрышем, я думал ниже с использованием некоторой функции CAST

Win/loss    
 Win        1
 Loss       0 
 Loss       0
 Loss       0
 Loss       0
 Win        5
 Win        1

или

Time    Team   Win/loss    No.per 'Win'
5:00   Red     Win          1
7:30  Red      Win          5
8:00   Red     Win          1

Любая помощь будет великолепна:)

Ответы [ 4 ]

0 голосов
/ 16 марта 2019
  1. Пронумеруйте все строки.
  2. Возьмите выигрыши и рассчитайте разницу их номеров.

Запрос:

select time, team, win_loss, rn - lag(rn) over (order by time) as diff
from
(
  select time, team, win_loss, row_number() over(order by time) as rn
  from mytable
) numbered
where win_loss = 'Win'
order by time;

Результат:

time | team | win_loss | diff
-----+------+----------+-----
5:00 | Red  | Win      |
7:30 | Red  | Win      | 5
8:00 | Red  | Win      | 1

Если вы хотите, чтобы в первом ряду вместо ноля был один, то используйте для этого COALESCE.

И если вы предпочитаете, вы можете переместить подзапрос вCTE (WITH предложение), конечно.

0 голосов
/ 15 марта 2019

Я чувствую, что это возможно немного сложнее, однако, вот как я получил результат в итоге:

USE Sandbox;
GO

CREATE TABLE Game (GameTime time,
                   Team varchar(5),
                   Result varchar(4));
INSERT INTO Game
VALUES('05:00','Red','Win'),
      ('05:30','Red','Loss'),
      ('06:00','Red','Loss'),
      ('06:30','Red','Loss'),
      ('07:00','Red','Loss'),
      ('07:30','Red','Win'),
      ('08:00','Red','Win');
GO
WITH Grps AS(
      SELECT GameTime,
             Team,
             Result,
             LAG(Result,1,'Win') OVER (PARTITION BY Team ORDER BY GameTime) AS LastResult,
             ROW_NUMBER() OVER (PARTITION BY Team ORDER BY GameTime) - 
             ROW_NUMBER() OVER (PARTITION BY Team, Result ORDER BY GameTime) AS Grp
      FROM Game),
Counts AS (
      SELECT GameTime,
             Team,
             Result,
             LastResult,
             COUNT(Team) OVER (PARTITION BY Team, Grp) AS GrpCount
      FROM Grps)
SELECT GameTime,
       Team,
       Result,
       CASE Result WHEN 'Loss' THEN 0
                   WHEN LastResult THEN 1
                   ELSE LAG(GrpCount,1,1) OVER (PARTITION BY Team ORDER BY GameTime)+1 END AS ToWin
FROM Counts;

GO
DROP TABLE Game;
0 голосов
/ 15 марта 2019

Попробуйте, (я мог бы подумать об использовании CTE как единственного способа решить эту проблему.)

With TeamWins AS (
    SELECT MIN(Time) as Time, Team, Result, 1 AS Count
    FROM Table as T
    WHERE Result = 'Win'
    GROUP BY Team, Result

    UNION ALL

    SELECT T.Time, T.Team, T.Result, CASE WHEN T.Result == 'Win' THEN 1 ELSE TW.Count+1 END COUNT
    FROM Table as T
    INNER JOIN TeamWins TW
        ON T.Team = TW.Team
)
SELECT Time, Team, Result, Count AS [No Per Win]
FROM TeamWins
WHERE Result='Win'
0 голосов
/ 15 марта 2019

Хммм.Я думаю:

with t as (
      select t.*, row_number() over (order by time) as seqnum
      from t
     )
select t.*,
       (case when win_loss = 'loss' then 0
             when seqnum = 1 then 1  -- boundary case
             else (seqnum -
                   max(case when win_loss = 'win' then seqnum end) over (order by seqnum rows between unbounded preceding and 1 preceding)
                  )
        end) as result
from t;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...