Вы не должны обрабатывать такой запрос с аналитические функции, если вы можете сделать это, просто агрегирование:
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 т ')
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)
С уважением, Роб.
Обычно, когда ORDERing DESC - это хорошая идея, чтобы заставить NULL быть LAST, поэтому вы с большей вероятностью возьмете строку с реальными данными. – EvilTeach
@EvilTeach Мое предположение было бы в том, что это вряд ли будет иметь значение NULL, но будет сделана точка и сделана редактирование. –
Это сработало чудесно. Большое спасибо – karlipoppins