Вы не должны обрабатывать такой запрос с аналитическими функциями, если вы можете сделать это простым агрегированием:
SQL> create table vote(id,id_idea,date_vote)
2 as
3 select 1, 3, date '2010-10-10' from dual union all
4 select 2, 0, date '2010-09-09' from dual union all
5 select 3, 3, date '2010-08-08' from dual union all
6 select 4, 3, date '2010-11-11' from dual union all
7 select 5, 0, date '2010-06-06' from dual union all
8 select 6, 1, date '2010-05-05' from dual
9 /
Table created.
SQL> select max(id) keep (dense_rank last order by date_vote) id
2 , id_idea
3 , max(date_vote) date_vote
4 from vote
5 group by id_idea
6 /
ID ID_IDEA DATE_VOTE
---------- ---------- -------------------
2 0 09-09-2010 00:00:00
6 1 05-05-2010 00:00:00
4 3 11-11-2010 00:00:00
3 rows selected.
По сравнению с аналитическим вариантом:
1) он работает (хорошоаналитическая также работает, если вы удалите «AS» в «AS t»)
2) она короче
3) она более понятна (хорошо, это субъективно)
4) он чуть более производительный, см .:
Это план для запроса агрегации:
Execution Plan
----------------------------------------------------------
Plan hash value: 2103353780
---------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
---------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 3 | 39 | 4 (25)| 00:00:01 |
| 1 | SORT GROUP BY | | 3 | 39 | 4 (25)| 00:00:01 |
| 2 | TABLE ACCESS FULL| VOTE | 6 | 78 | 3 (0)| 00:00:01 |
---------------------------------------------------------------------------
И это план для аналитического запроса:
Execution Plan
----------------------------------------------------------
Plan hash value: 781916126
---------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
---------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 6 | 288 | 4 (25)| 00:00:01 |
|* 1 | VIEW | | 6 | 288 | 4 (25)| 00:00:01 |
|* 2 | WINDOW SORT PUSHED RANK| | 6 | 78 | 4 (25)| 00:00:01 |
| 3 | TABLE ACCESS FULL | VOTE | 6 | 78 | 3 (0)| 00:00:01 |
---------------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
1 - filter("RN"=1)
2 - filter(ROW_NUMBER() OVER ( PARTITION BY "ID_IDEA" ORDER BY
INTERNAL_FUNCTION("DATE_VOTE") DESC NULLS LAST)<=1)
С уважением, Роб.