解析函数窗口子句
Analytic function windowing clause
VAL 列是从 1 到 3 的数字列表,其他列应该显示:
- A) 所有低于 VAL
的值的最小值
- B) 所有低于 VAL
的值的最大值
- C) 所有大于 VAL
的值中的 MIN
- D) 所有更大的最大值
值比 VAL
我希望得到这样的结果:
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
/
有人看出这个查询有什么问题吗?
提前致谢!
错误在 val preceding
和 val following
中。应该是 1 preceding
和 1 following
.
你在那里指定的数字是相对于当前记录的,对应于 val 的记录(在给定的 window 顺序中),所以如果你指定 val
你会返回(或超前)太远了。您应该需要在当前记录之前(或之后)获得最多 min/max 一条记录。
所以:
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
/
VAL 列是从 1 到 3 的数字列表,其他列应该显示:
- A) 所有低于 VAL 的值的最小值
- B) 所有低于 VAL 的值的最大值
- C) 所有大于 VAL 的值中的 MIN
- D) 所有更大的最大值 值比 VAL
我希望得到这样的结果:
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
/
有人看出这个查询有什么问题吗?
提前致谢!
错误在 val preceding
和 val following
中。应该是 1 preceding
和 1 following
.
你在那里指定的数字是相对于当前记录的,对应于 val 的记录(在给定的 window 顺序中),所以如果你指定 val
你会返回(或超前)太远了。您应该需要在当前记录之前(或之后)获得最多 min/max 一条记录。
所以:
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
/