我正在将一个巨大的Excel文件转换为SQL Server存储过程,以实现一些自动化。我刚刚偶然发现了一个excel列,它引用了自己。我不知道如何将其转换为存储过程。也许你们可以帮忙。
这是我导入SQL Server的excel的一部分:
+------------------+----------------+--------------+----------------+
| PLAYER LAST NAME | DRILL TITLE | SESSION DATE | TOTAL DISTANCE |
+------------------+----------------+--------------+----------------+
| Fernandes | Entire Session | 05.08.2020 | 5565 |
| Fernandes | Entire Session | 06.08.2020 | 3484 |
+------------------+----------------+--------------+----------------+
在Excel中,有一个名为";总距离EWMA(28(";它就像:
=IFERROR((AVERAGEIFS([Total Distance EWMA (28)];[PLAYER LAST NAME];[@[PLAYER LAST NAME]];[DRILL TITLE];"Entire Session";[SESSION DATE];[@[SESSION DATE]]-1));[@[TOTAL DISTANCE]])
存储过程的期望输出是:
+------------------+----------------+--------------+----------------+-----------------------------+
| PLAYER LAST NAME | DRILL TITLE | SESSION DATE | TOTAL DISTANCE | Total Distance EWMA (28) |
+------------------+----------------+--------------+----------------+-----------------------------+
| Fernandes | Entire Session | 05.08.2020 | 5565 | 5565 |
| Fernandes | Entire Session | 06.08.2020 | 3484 | 5565 |
+------------------+----------------+--------------+----------------+-----------------------------+
但我的问题是计算存储过程中的平均值。在我的目标表中;总距离EWMA(28(";是空的。
所以
SELECT AVG([Total Distance EWMA (28)]) FROM target;
在选择要传递到目标表中的数据时,将始终返回null。我需要为我插入的每一行计算目标表中这一列的平均值。
有什么聪明的方法可以做到这一点吗?
我想你想要一个窗口函数:
SELECT AVG([Total Distance]) OVER (PARTITION BY [Player Last Name]) as avg_distance
FROM target;
您也可以将其合并到UPDATE
中,但不清楚这是否是问题的一部分:
with toupdate as (
SELECT t.*,
AVG([Total Distance]) OVER (PARTITION BY [Player Last Name]) as avg_distance
FROM target t
)
update toupdate
set avg_total_disance = avg_distance;
FROM target;