Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Подсчитать сумму определённого процента первых строк в столбце (PL SQL Developer) / 7 сообщений из 7, страница 1 из 1
01.09.2016, 17:49:23
    #39302207
Vulgs
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Подсчитать сумму определённого процента первых строк в столбце (PL SQL Developer)
Подскажите пожалуйста, каким образом можно посчитать скажем 30% максимальных значений в столбце (кол-во строк в столбце изначально неизвестно). Задача реализована следующим запросом, но можно ли сделать это более оптимальным образом, желательно в один запрос?
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
select sum(case when temp = 1 then q end)
from
(
select q, case when n <= ceil(max(n) over()*0.3) then 1 end temp
from
(
select q, row_number() over (order by q desc) n
from
(
select 1000000 q from dual union all
select 200000 from dual union all
select 30000 from dual union all
select 4000 from dual union all
select 500 from dual union all
select 60 from dual union all
select 7 from dual 
)
)
)
...
Рейтинг: 0 / 0
01.09.2016, 18:21:46
    #39302237
bishnike
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Подсчитать сумму определённого процента первых строк в столбце (PL SQL Developer)
Vulgs,

т.е. вас устраивает что 3 строки из 7 - это 30% выборки?
...
Рейтинг: 0 / 0
01.09.2016, 18:32:27
    #39302246
Vulgs
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Подсчитать сумму определённого процента первых строк в столбце (PL SQL Developer)
bishnike,
Да, устраивает. Округление вверх взято намеренно. Если в столбике будет 2 значения, то необходимо будет выбрать 1.
Вообще, этот момент совершенно не критичен, как мне кажется.
...
Рейтинг: 0 / 0
01.09.2016, 18:39:19
    #39302254
bishnike
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Подсчитать сумму определённого процента первых строк в столбце (PL SQL Developer)
Vulgs,

как минимум начните с упразднения одного уровня

count()over() дает тоже самое что max(row_number()over())
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
select sum(case when n <= perc then q end)
from
(
select q, row_number() over (order by q desc) n, ceil(count(1)over()*0.3) as perc
from
(
select 1000000 q from dual union all
select 200000 from dual union all
select 30000 from dual union all
select 4000 from dual union all
select 500 from dual union all
select 60 from dual union all
select 7 from dual 
)
)

...
Рейтинг: 0 / 0
01.09.2016, 19:10:03
    #39302269
Vulgs
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Подсчитать сумму определённого процента первых строк в столбце (PL SQL Developer)
bishnike,
Да, спасибо, так лучше конечно.
Общая логика получается такая - первым подзапросом мы применяем аналитические функции по максимуму, вторым - агрегатные к получившемуся результату. Совместить аналитические и агрегатные функции на одном шагу у меня не получилось, значит и задачу эту в "одно действие" сделать не получится. Или всё таки есть способ?
...
Рейтинг: 0 / 0
01.09.2016, 19:23:20
    #39302281
bishnike
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Подсчитать сумму определённого процента первых строк в столбце (PL SQL Developer)
Vulgsу меня не получилось, значит ... не получитсяуверенности вашей можно только позавидовать :D

А на какой версии СУБД вы работаете?
...
Рейтинг: 0 / 0
01.09.2016, 21:16:04
    #39302315
andrey_anonymous
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Подсчитать сумму определённого процента первых строк в столбце (PL SQL Developer)
Ну если очень-очень хочется чтобы всенепременно без агрегации "вторым шагом"...
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
with t as (select 1000000 q from dual union all
select 200000 from dual union all
select 30000 from dual union all
select 30000 from dual union all -- обратите внимание
select 4000 from dual union all
select 500 from dual union all
select 60 from dual union all
select 7 from dual )
-----------------------
select sq 
from(
  select q, sum(q) over(order by q desc, rownum) sq
       , ceil(.3*count(*) over()) - row_number() over( order by q desc, rownum) f
  from t
) where f = 0

SQ                                      
--------------------------------------- 
1230000                                 

1 rows selected

-- Или как-нибудь так:
with t as (select 1000000 q from dual union all...)
-----------------------
select sq 
from t
model return updated rows
dimension by (ceil(.3*count(*) over()) - row_number() over( order by q desc, rownum) pd)
measures (q sq)
rules(sq[0] = sum(sq)[pd >= 0])

SQ                                      
--------------------------------------- 
1230000                                 

1 rows selected




в 12с можно самовыразиться лаконичненько:
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
SQL> with t as (select 1000000 q from dual union all
...
  8  )
  9  select sum(q) from (
 10    select q from t
 11    order by q desc
 12    fetch first 30 percent rows only);

    SUM(Q)
----------
   1230000

SQL>


Унутре у ей неонка (с) - те же row_number() over() и ceil от 30/100 * count() over()
...
Рейтинг: 0 / 0
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Подсчитать сумму определённого процента первых строк в столбце (PL SQL Developer) / 7 сообщений из 7, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]