如何将 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);
我是 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);