【发布时间】: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