品牌打屁股使用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
任何帮助都会很棒:)
答案 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)
查询:
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
子句)。