Ben*_*oit 8 oracle analytic-functions
我用Oracle编写了一个复杂的SQL查询,我想在同一个分区上使用两个解析函数.
让我们很简单,但不要太多:
SELECT col1,
MAX(col2) OVER(PARTITION BY col3, col4, col5, col6,
CASE WHEN col7 LIKE 'foo'
THEN SUBSTR(col7,1,5)
ELSE col7
END
ORDER BY col5 ASC, col6 DESC),
MIN(col2) OVER(PARTITION BY col3, col4, col5, col6,
CASE WHEN col7 LIKE 'foo'
THEN SUBSTR(col7,1,5)
ELSE col7
END
ORDER BY col5 ASC, col6 DESC)
FROM my_table;
Run Code Online (Sandbox Code Playgroud)
是否有更优雅的语法来分解该PARTITION BY条款?
谢谢.
a_h*_*ame 12
如果您指的是标准的WINDOW子句,如下所示:
SELECT col1,
MAX(col2) OVER(w),
MIN(col2) OVER(w)
FROM my_table
WINDOW w AS (PARTITION BY col3, col4, col5, col6,
CASE WHEN col7 LIKE 'foo'
THEN SUBSTR(col7,1,5)
ELSE col7
END
ORDER BY col5 ASC, col6 DESC);
Run Code Online (Sandbox Code Playgroud)
然后我相信答案是否定的,Oracle不支持这个(用11gR2检查).
您可以使用子查询因子,也称为with子句:
(另)
with t as
( select col1
, col2
, col3
, col4
, col5
, col6
, case col7
when 'foo' then
substr(col7,1,5)
else
col7
end col7
from my_table
)
select col1
, max(col2) over (partition by col3,col4,col5,col6,col7 order by col5,col6 desc)
, min(col2) over (partition by col3,col4,col5,col6,col7 order by col5,col6 desc)
from t
Run Code Online (Sandbox Code Playgroud)
问候,
Rob.
| 归档时间: |
|
| 查看次数: |
21083 次 |
| 最近记录: |