2017-08-18 8 views
1
VALが1から3の番号リストは、他の列を表示するようになっている

カラム:全ての下位のVALより全て低い値の分析関数ウィンドウ句

  • A)MIN
  • B)MAX VALより値VALより全て大きい値VAL
  • より全て大きい 値の
  • D)MAXの
  • C)MIN

私はwoulこの結果を期待dは:

V A B C D 
------------------- 
1 | | | 2 | 3 
2 | 1 | 1 | 3 | 3 
3 | 1 | 2 | | 

をしかし、私が得る結果は次のとおりです。

V A B C D 
------------------- 
1 | | | 2 | 3 
2 | | | | 
3 | | | | 

(*)のすべての空白セルがあるNULL結果

私が書いたクエリ:

WITH T AS 
     (SELECT  CAST(LEVEL AS NUMBER) val 
     FROM  DUAL 
     CONNECT BY LEVEL < 4) 
SELECT val 
     ,MIN(val) OVER(ORDER BY val RANGE BETWEEN UNBOUNDED PRECEDING AND val PRECEDING) A --MIN_PRECEDING 
     ,MAX(val) OVER(ORDER BY val RANGE BETWEEN UNBOUNDED PRECEDING AND val PRECEDING) B --MAX_PRECEDING 
     ,MIN(val) OVER(ORDER BY val RANGE BETWEEN val FOLLOWING AND UNBOUNDED FOLLOWING) C --MIN_FOLLOWING 
     ,MAX(val) OVER(ORDER BY val RANGE BETWEEN val FOLLOWING AND UNBOUNDED FOLLOWING) D --MAX_FOLLOWING 
FROM  T 
WHERE val IS NOT NULL 
ORDER BY 1 
/

誰でもこのクエリの何が間違っているのを見ていますか?

ありがとうございます!

+0

私はこれについての詳細を学ぶために希望してきました。質問のおかげで! – xQbert

答えて

2

エラーはval precedingval followingです。それは1 preceding1 followingである必要があります。

指定された番号は、現在のレコードとの相対的なもので、指定されたウィンドウ順序でvalに対応するレコードです。したがって、valを指定すると、あまりにも遠くに戻ることになります。現在のレコードの前(または後)に最大/最大レコードを1つまで取得する必要があります。だから、

WITH T AS 
     (SELECT  CAST(LEVEL AS NUMBER) val 
     FROM  DUAL 
     CONNECT BY LEVEL < 4) 
SELECT val 
     ,MIN(val) OVER(ORDER BY val RANGE BETWEEN UNBOUNDED PRECEDING AND 1 PRECEDING) A 
     ,MAX(val) OVER(ORDER BY val RANGE BETWEEN UNBOUNDED PRECEDING AND 1 PRECEDING) B 
     ,MIN(val) OVER(ORDER BY val RANGE BETWEEN 1 FOLLOWING AND UNBOUNDED FOLLOWING) C 
     ,MAX(val) OVER(ORDER BY val RANGE BETWEEN 1 FOLLOWING AND UNBOUNDED FOLLOWING) D 
FROM  T 
WHERE val IS NOT NULL 
ORDER BY 1 
/
関連する問題