0

これは MYSQL に似ており、ウィンドウ関数で SUM と POWER を一緒に使用できない理由を理解するのに苦労しています。具体的には、SUM(POWER("DELTA"... 行で次のエラーがスローされます。

SQL compilation error: Window function [AVG(CAST(VALUE AS NUMBER(38,3))) OVER (PARTITION BY ID)] may not be nested inside another window function.

この行を削除するか、2 番目の select ステートメントに移動すると、エラーが修正され、他のすべてが修正されます。これは、私が持っているより根本的な SQL の誤解だと思います。どんな考えでも大歓迎です!

WITH UTILS AS (
SELECT
  ID,
  VALUE AS "TEMP_CELSIUS,
  AVG(VALUE) OVER(PARTITION BY ID) AS "TEMP_AVG",
  VAR_POP(VALUE) OVER(PARTITION BY ID) As "TEMP_VAR",
  STDDEV_POP(VALUE) OVER(PARTITION BY ID) As "TEMP_STD",
  COUNT(VALUE) OVER(PARTITION BY ID) As "DEVICE_N",
  (VALUE-"TEMP_AVG") AS "DELTA",
  SUM(POWER("DELTA", 3)) OVER(PARTITION BY ID) AS "SKEW2"
FROM
  TABLE1
)
SELECT 
  "SKEW2"
FROM
  UTILS
4

1 に答える 1

0

明確にするために、あなたの問題はPOWER正確ではありませんでしたが、それは、を含む派生列をPOWER参照していました。TEMP_AVGwindow 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 listyour の後に 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の結果であり、オプションで、 などが含まれます。FROMWHEREGROUP BY

それでは、あなたが質問した . 式にジャンプしましょうwindow function

Syntax Rule該当するもの:

11) Each column reference contained in a <window function> shall unambiguously reference a column of T.

あなたの場合、の列ではなくderived column、現在の のを参照していました。select listT

それが問題です。標準では、 の列のみに制限されています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 つのウィンドウ関数でそれを行うことはできません。

于 2021-08-30T23:07:57.703 に答える