powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Подсчитать сумму определённого процента первых строк в столбце (PL SQL Developer)
7 сообщений из 7, страница 1 из 1
Подсчитать сумму определённого процента первых строк в столбце (PL SQL Developer)
    #39302207
Vulgs
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Подскажите пожалуйста, каким образом можно посчитать скажем 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
Подсчитать сумму определённого процента первых строк в столбце (PL SQL Developer)
    #39302237
bishnike
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Vulgs,

т.е. вас устраивает что 3 строки из 7 - это 30% выборки?
...
Рейтинг: 0 / 0
Подсчитать сумму определённого процента первых строк в столбце (PL SQL Developer)
    #39302246
Vulgs
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
bishnike,
Да, устраивает. Округление вверх взято намеренно. Если в столбике будет 2 значения, то необходимо будет выбрать 1.
Вообще, этот момент совершенно не критичен, как мне кажется.
...
Рейтинг: 0 / 0
Подсчитать сумму определённого процента первых строк в столбце (PL SQL Developer)
    #39302254
bishnike
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
Подсчитать сумму определённого процента первых строк в столбце (PL SQL Developer)
    #39302269
Vulgs
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
bishnike,
Да, спасибо, так лучше конечно.
Общая логика получается такая - первым подзапросом мы применяем аналитические функции по максимуму, вторым - агрегатные к получившемуся результату. Совместить аналитические и агрегатные функции на одном шагу у меня не получилось, значит и задачу эту в "одно действие" сделать не получится. Или всё таки есть способ?
...
Рейтинг: 0 / 0
Подсчитать сумму определённого процента первых строк в столбце (PL SQL Developer)
    #39302281
bishnike
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Vulgsу меня не получилось, значит ... не получитсяуверенности вашей можно только позавидовать :D

А на какой версии СУБД вы работаете?
...
Рейтинг: 0 / 0
Подсчитать сумму определённого процента первых строк в столбце (PL SQL Developer)
    #39302315
Фотография andrey_anonymous
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну если очень-очень хочется чтобы всенепременно без агрегации "вторым шагом"...
Код: 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
7 сообщений из 7, страница 1 из 1
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Подсчитать сумму определённого процента первых строк в столбце (PL SQL Developer)
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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