выборка максимума

skelet
Дата: 26.11.2009 19:09:54
create table xxxx (id number(10) primary key, val varchar2(100), type varchar2(100), cnt number(10));

данные такого типа:
xxx - abc - 10
xxx - fff - 8
xxx - ggg - 4
yyy - abc - 10
yyy - fff - 7
zzz - abc - 6
zzz - ggg - 5


ну и т.д. такого вот барахла.
cnt - типа счёечик того, сколько у объекта val сущностей type

хочется выбрать первые, ну допустим 2, с максимальным кол-вом всяких сущностей
т.е

select * from (
    select distinct(val), sum(cnt) over (partition by val) tt from xxxx
    order by tt desc)
where rownum <= 2; 


можно ли то же самое сделать без долбаного подзапроса?.. (в принципе в задачке косячок, если у более чем 2-х сумма будет равно, но тогда пусть будут любые два, что в моём запросике и отражено)
wildwind
Дата: 26.11.2009 19:20:18
skelet,

А что за религия запрещает подзапросы?
Elic
Дата: 26.11.2009 19:58:41
skelet
select distinct(val), sum(cnt) over (partition by val) tt from xxxx
Меня всегда поражает параноидальное желание делать через ж..., когда нужно просто:
select val, sum(cnt) as tt from xxxx group by val
И +1 к wildwind-у.
skelet
Дата: 27.11.2009 11:55:55
Elic
просто:
select val, sum(cnt) as tt from xxxx group by val


хорошо, пусть
select val, sum(cnt) as tt from xxxx group by val
order by tt desc;

от внешнего-то запроса это никак не спасает :(
Elic
Дата: 27.11.2009 11:58:25
skelet
от внешнего-то запроса это никак не спасает :(
Причина плача до сих пор не раскрыта.
Babe_Vampire
Дата: 27.11.2009 12:28:50
skelet,
не используйте подзапрос, если религия запрещает, просто отсортируйте по сумме и для клиента поставьте fetch в 2 записи
----
Oracle 11.1.0.7 - 64bit - SLES10
suPPLer
Дата: 27.11.2009 13:19:39
Babe_Vampire
skelet,
не используйте подзапрос, если религия запрещает, просто отсортируйте по сумме и для клиента поставьте fetch в 2 записи


Тогда уж договаривать надо: "и добавьте FIRST_ROWS, используя хинт или параметр OPTIMIZER_MODE".
mpi1979
Дата: 28.11.2009 02:25:23
skelet


хочется выбрать первые, ну допустим 2, с максимальным кол-вом всяких сущностей



2, 3 и т.д. в девятке точно нельзя (если можно в более поздних версиях, поделитесь инфой), а вот одну первую всегда пожалуйста:

select max(val) keep (dense_rank last order by sum(cnt))
from xxxx
group by val

P.S. в MySQL limit рулит.
suPPLer
Дата: 28.11.2009 13:17:13
mpi1979
2, 3 и т.д. в девятке точно нельзя (если можно в более поздних версиях, поделитесь инфой)


Читайте, что ли, первый пост в этой теме... Можно всё, но с подзапросом, который тут как раз к месту. И проверьте свой запрос, в котором абсолютно излишни keep (dense_rank ...).
mpi1979
Дата: 28.11.2009 13:27:28
suPPLer
mpi1979
2, 3 и т.д. в девятке точно нельзя (если можно в более поздних версиях, поделитесь инфой)


Читайте, что ли, первый пост в этой теме... Можно всё, но с подзапросом, который тут как раз к месту. И проверьте свой запрос, в котором абсолютно излишни keep (dense_rank ...).


С подзапросом естественно можно, об этом и речи не идет. Я же предоставил код, дающий результат без подзапроса. К сожалению, он дает только одно значение val, соответствующее максимуму cnt.
Касательно излишности keep (dense_rank ...) - посмотрите на мой запрос внимательно и ваши комментарии отпадут. Если не отпадут, тогда советую почитать литературу. Секреты Oracle SQL Бьюли и Мишра вполне подойдут в данном случае.