指定WHERE行之间的sql差异

时间:2019-03-15 20:04:12

标签: sql sql-server database

品牌打屁股使用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 :(得分:0)

嗯。我在想:

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;

答案 1 :(得分:0)

我觉得这也许有些复杂,但是,这是我最终得出的结果:

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;

答案 2 :(得分:0)

尝试一下,(我可以考虑使用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'

答案 3 :(得分:0)

  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

如果第一行要一个而不是null,请使用COALESCE

如果愿意,您当然可以将子查询移至CTE(WITH子句)。