正在将具有自引用的Excel公式转换为SQL Server存储过程



我正在将一个巨大的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;

最新更新