引用列内的计算列

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