如何将 window 函数输出直接传递到 SQL 中的新 window 函数?

How to pipe window function output directly into a new window function in SQL?

我是 SQL 的新手,我有以下问题:

-- Ref 1
SELECT *,
Max(Watts) OVER (PARTITION BY Freq) as MyMax,
log10(SUM(MyMax) OVER SumFunct * 1000) * 10 AS MySum
FROM MyTable
WINDOW SumFunct as (PARTITION BY temp, Freq, channel);

由于 no such column: MyMax,这不起作用。尽管根据我的理解,MyMax 的列是动态创建的,但我猜测 SQL 仍然无法立即将其值用作下一个 window 的输入函数

我已经尝试为 MaxPower 创建列并在上面的查询之前填充它,通过

-- Ref 2
ALTER TABLE MyTable ADD COLUMN MyMax real;
UPDATE MyTable SET MyMax = sub.MyMax 
FROM (
   SELECT *, Max(Watts) OVER (PARTITION BY Freq) AS MyMax
) sub;

但我不知道如何在 UPDATE 语句中使用 window 函数设置 MyMax。我的尝试是创建一个子查询,但我觉得我使问题过于复杂,而且由于 SELECT 中的某些语法我无法隔离,我也没有得到这个工作。

我想做的就是使用上面的 window 函数查询 MyMax,然后将其通过管道传输到新的 window 函数中。结果:两个额外的列包含我需要的数据。我对 window 函数的理解是,它们会即时创建您想要的列,但即使我将顶级查询(参考 1)分解为两个不同的调用:

-- Ref3
SELECT *,
Max(Watts) OVER (PARTITION BY Freq) as MyMax,
FROM MyTable;
SELECT *,
log10(SUM(MyMax) OVER SumFunct * 1000) * 10 AS MySum
FROM MyTable
WINDOW SumFunct as (PARTITION BY temp, Freq, channel);

它仍然无法识别 MyMax 是什么。有人对如何解决这个问题有任何指导吗?

不允许 window 函数嵌套。

您需要一个 returns MyMax 的子查询和 return MySum:

的主查询
SELECT *, log10(SUM(MyMax) OVER SumFunct * 1000) * 10 AS MySum
FROM (
  SELECT *, Max(Watts) OVER (PARTITION BY Freq) AS MyMax
  FROM MyTable
)
WINDOW SumFunct as (PARTITION BY temp, Freq, channel);

或者,CTE:

WITH cte AS (
  SELECT *, Max(Watts) OVER (PARTITION BY Freq) as MyMax
  FROM MyTable
)
SELECT *, log10(SUM(MyMax) OVER SumFunct * 1000) * 10 AS MySum
FROM cte
WINDOW SumFunct as (PARTITION BY temp, Freq, channel);