引用列内的计算列
Refer to the calculated column within the column
列ORtg_home包含不同于零和零的值。我的目的是创建一个新列 (X),其中只有不带零的值。 (在第一场主场比赛之后。如果它是零,则返回 ORtg_home 中不为零的最后一个值)。
Team
Game_total
Home_away
Game_home
Game_away
ORtg_avg
ORtg_home
x
ATL
1
away
0
1
100
0
0
ATL
2
home
1
1
101
102
102
ATL
3
away
1
2
104
0
102
ATL
4
away
1
3
106
0
102
我试过下面的代码:
SELECT
[ORtg_home]
,(CASE WHEN [Home_away] = 'home' THEN ([ORtg_home])
ELSE
LAG(ORtg_home, 1) OVER (PARTITION BY Team ORDER BY [Game_total] ASC, Home_away ASC) END) as XXX
FROM [table1]
这给出了第 3 场比赛的 102,但是第 x 列中的第 4 场比赛的值仍然是 0。球队可能会有所不同。目前table不包含比赛日期,但可以添加。
CREATE TABLE [test1]
(
[Team] VARCHAR(3)
,[Game_total] INT
,[Home_away] VARCHAR(4)
,[Game_home] INT
,[Game_away] INT
,[ORtg_avg] FLOAT
,[ORtg_home] FLOAT
,[x] FLOAT
)
INSERT INTO [test1]
[Team], [Game_total], [Home_away], [Game_home], [Game_away, [ORtg_avg] ,[ORtg_home]
VALUES (ATL, 1, 'away', 0, 1, 100, 0)
VALUES (ATL, 2, 'home', 1, 1, 101, 102)
VALUES (ATL, 3, 'away', 1, 2, 104, 0)
VALUES (ATL, 4, 'away', 1, 3, 106, 0)
如果 LAST_VALUE
支持 IGNORE_NULLS
子句,这会更容易,因为您可以将零转换为 NULL
并使用它。
如果没有这个你可以使用下面的方法(fiddle)
WITH T AS
(
SELECT *,
MAX(FORMAT(Game_total,'D10') + FORMAT(NULLIF(ORtg_home,0),'R')) OVER (PARTITION BY Team ORDER BY [Game_total] ASC) AS _x
FROM test1
)
SELECT Team,
Game_total,
Home_away,
Game_home,
Game_away,
ORtg_avg,
ORtg_home,
COALESCE(SUBSTRING(_x, 11, 100), 0E0) AS x
FROM T
列ORtg_home包含不同于零和零的值。我的目的是创建一个新列 (X),其中只有不带零的值。 (在第一场主场比赛之后。如果它是零,则返回 ORtg_home 中不为零的最后一个值)。
Team | Game_total | Home_away | Game_home | Game_away | ORtg_avg | ORtg_home | x |
---|---|---|---|---|---|---|---|
ATL | 1 | away | 0 | 1 | 100 | 0 | 0 |
ATL | 2 | home | 1 | 1 | 101 | 102 | 102 |
ATL | 3 | away | 1 | 2 | 104 | 0 | 102 |
ATL | 4 | away | 1 | 3 | 106 | 0 | 102 |
我试过下面的代码:
SELECT
[ORtg_home]
,(CASE WHEN [Home_away] = 'home' THEN ([ORtg_home])
ELSE
LAG(ORtg_home, 1) OVER (PARTITION BY Team ORDER BY [Game_total] ASC, Home_away ASC) END) as XXX
FROM [table1]
这给出了第 3 场比赛的 102,但是第 x 列中的第 4 场比赛的值仍然是 0。球队可能会有所不同。目前table不包含比赛日期,但可以添加。
CREATE TABLE [test1]
(
[Team] VARCHAR(3)
,[Game_total] INT
,[Home_away] VARCHAR(4)
,[Game_home] INT
,[Game_away] INT
,[ORtg_avg] FLOAT
,[ORtg_home] FLOAT
,[x] FLOAT
)
INSERT INTO [test1]
[Team], [Game_total], [Home_away], [Game_home], [Game_away, [ORtg_avg] ,[ORtg_home]
VALUES (ATL, 1, 'away', 0, 1, 100, 0)
VALUES (ATL, 2, 'home', 1, 1, 101, 102)
VALUES (ATL, 3, 'away', 1, 2, 104, 0)
VALUES (ATL, 4, 'away', 1, 3, 106, 0)
如果 LAST_VALUE
支持 IGNORE_NULLS
子句,这会更容易,因为您可以将零转换为 NULL
并使用它。
如果没有这个你可以使用下面的方法(fiddle)
WITH T AS
(
SELECT *,
MAX(FORMAT(Game_total,'D10') + FORMAT(NULLIF(ORtg_home,0),'R')) OVER (PARTITION BY Team ORDER BY [Game_total] ASC) AS _x
FROM test1
)
SELECT Team,
Game_total,
Home_away,
Game_home,
Game_away,
ORtg_avg,
ORtg_home,
COALESCE(SUBSTRING(_x, 11, 100), 0E0) AS x
FROM T