【问题标题】:Refer to the calculated column within the column参考列内计算列
【发布时间】:2021-07-30 15:59:45
【问题描述】:

列 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。球队可能会有所不同。目前表格不包含比赛日期,但可以添加。

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)

【问题讨论】:

  • Edit问题并提供minimal reproducible example,即涉及的表或其他对象的CREATE语句(粘贴文本,不要使用图像,不要链接到外部站点),INSERT 用于示例数据 (dito) 的语句以及带有表格文本格式的示例数据的所需结果。标记您的 DBMS。
  • 您不能拥有计算列引用本身。所以这个想法是一个非首发,提供示例数据并显示您期望的数据最终结果,以便我们了解如何最好地做到这一点
  • 计算列引用自身没有任何意义。它会有效地导致无限循环,因为每次它引用自己时,值都会改变,这意味着它需要无限地重新计算。
  • @Larnu 在 LAG 中引用它不会导致这样的无限循环。它只会使用该列在前一行中评估的值。这有时会很有用,但无论如何都是不允许的
  • 对我来说这很明显,顺便说一句谢谢我修改了它。我希望它是正确的格式。引用自己..似乎有点合乎逻辑。也许是因为滞后归还了最后一行。不幸的是,我不能使用 1 作为常数,因为它会改变连续多少场主客场比赛。

标签: sql sql-server tsql lag


【解决方案1】:

如果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 

【讨论】:

  • SQL Server 是否支持忽略空值?我应该如何将它添加到下面的代码中? LAST_VALUE (ORtg_home) OVER (PARTITION BY Team ORDER BY Game_total ASC) END)
  • 在此期间我尝试了您的方法,它很棒并且有效,非常感谢您。现在我试图了解 _x 计算是如何工作的。你能解释一下吗?如果 ORtg_home 是浮点数,而不是 INT,我应该如何修改,如果我想添加一些不同于零的其他值怎么办? (如果还没有主场比赛就是这种情况)
  • @tomatoma37 - (1) 不支持 IGNORE_NULLS - 否则我会使用它。 (2) 针对 float 数据类型进行了更新。 (3) 要使用除零以外的东西,请更改NULLIF(ORtg_home,0)中的零
猜你喜欢
  • 2022-07-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-01-12
  • 2015-06-28
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多