明確にするために、あなたの問題はPOWER
正確ではありませんでしたが、それは、を含む派生列をPOWER
参照していました。TEMP_AVG
window function
標準 SQL では、同じ .xml 内の後続のアイテムで 1 つの派生列を参照することもできませんselect list
。
これは問題です:
SELECT a + b AS c
, c + d AS e
FROM t1
;
以下は、特にウィンドウ関数といくつかのサポート項目を参照する標準 SQL 仕様の一部です。
「基本的なSQL」について質問しました。データベースが非標準の動作をサポートしている場合でも、出発点として、少なくとも基本的な観点から、標準 SQL によって提供される動作を理解しておくと役立つ場合があります。
これは、わずかに古いバージョンの仕様 (2011 年 12 月付けの基礎文書) からの詳細のほんの一部です。これの多くは変わっていません。
セクション:7.12 <query specification>
には:
<query specification> ::= SELECT [ <set quantifier> ] <select list> <table expression>
select list
your の後に a が続くことがわかりますtable expression
。
あなたの質問は、基本的に で何が許可されているかについてです<select list>
。
しかし、select list
動作を理解するために、 という用語を少し覗く必要があります<table expression>
。
<table expression> ::=
<from clause>
[ <where clause> ]
[ <group by clause> ]
[ <having clause> ]
[ <window clause> ]
対応Syntax Rules
する a<query expression>
では、次のことがわかります。
2) Let T be the result of the <table expression> simply contained in QSPEC.
基本的に、句T
の結果であり、オプションで、 などが含まれます。FROM
WHERE
GROUP BY
それでは、あなたが質問した . 式にジャンプしましょうwindow function
。
Syntax Rule
該当するもの:
11) Each column reference contained in a <window function> shall unambiguously reference a column of T.
あなたの場合、の列ではなくderived column
、現在の のを参照していました。select list
T
それが問題です。標準では、 の列のみに制限されていますT
。
注意してください、私は巨大な仕様から非常に小さなビットを選んでいます. しかし、これは基本的な詳細を指摘していると思います。
一般的なアプローチの 1 つは、単にwindow function
を後続のクエリ式に移動しT
て、最初の派生列を含む を参照するようにすることです。
WITH cte1 AS (
SELECT ...
, AVG(...) OVER ... AS temp_avg
FROM t1
)
SELECT ...
, SUM(temp_avg) OVER ...
FROM cte1
;
必要に応じて、別の CTE 用語や派生テーブルを使用せずに、派生列で使用される式を繰り返すことができる場合もあります。少なくとも標準 SQL では、2 つのウィンドウ関数でそれを行うことはできません。