2013-05-22 3 views
0

У меня есть таблица interest_summary таблицу с двумя столбцами:Как найти регионы, в которых в общей сложности их продажи превысили 60%

  • int_rate номер,
  • total_balance Номер

пример

10.25 50 
10.50 100 
10.75 240 
11.00 20 

Мой запрос должен возвращаться в 2 столбцах или строке, например, 10.50 до 10,75, поскольку добавление их общего количества превышает 60% от общего количества, добавленного вместе

Не могли бы вы предложить логику в Oracle?

ответ

2
select 
    min(int_rate), 
    max(int_rate) 
from 
    (
    select 
     int_rate, 
     nvl(sum(total_balance) over(
     order by total_balance desc 
     rows between unbounded preceding and 1 preceding 
    ),0) as part_sum 
    from interest_summary 
) 
where 
    part_sum < (select 0.6*sum(total_balance) from interest_summary) 

fiddle

1

Я предполагаю, что вы выбираете строки на основе следующего алгоритма:

  1. Отсортируйте строки по total_balance (по убыванию)
  2. Выберите самый высокий total_balance оставшееся в очереди
  3. Если его сумма total_balance добавлена ​​к общей сумме всего баланса менее 60%, добавьте ее в пул и введите следующую строку (шаг 2)
  4. Если не добавить строку в пул и вернуться.

отсортированный работает всего выглядит так (я номер строки, так что это легче понять, что происходит):

SQL> WITH data AS (
    2   SELECT 1 id, 10.25 interest_rate, 50 total_balance FROM DUAL 
    3 UNION ALL SELECT 2 id, 10.50 interest_rate, 100 total_balance FROM DUAL 
    4 UNION ALL SELECT 3 id, 10.75 interest_rate, 240 total_balance FROM DUAL 
    5 UNION ALL SELECT 4 id, 11.00 interest_rate, 20 total_balance FROM DUAL 
    6 ) 
    7 SELECT id, interest_rate, 
    8   SUM(total_balance) OVER (ORDER BY total_balance DESC) running_total, 
    9   SUM(total_balance) OVER (ORDER BY total_balance DESC) 
10  /
11   SUM(total_balance) OVER() * 100 pct_running_total 
12 FROM data 
13 ORDER BY 3; 

     ID INTEREST_RATE RUNNING_TOTAL PCT_RUNNING_TOTAL 
---------- ------------- ------------- ----------------- 
     3   10,75   240 58,5365853658537 
     2   10,5   340 82,9268292682927 
     1   10,25   390 95,1219512195122 
     4   11   410    100 

Таким образом, в этом примере мы должны возвращать строки 3 и 2, так как ряд 2 является первой строкой, где его процент работает общее выше 60%:

SQL> WITH data AS (
    2   SELECT 1 id, 10.25 interest_rate, 50 total_balance FROM DUAL 
    3 UNION ALL SELECT 2 id, 10.50 interest_rate, 100 total_balance FROM DUAL 
    4 UNION ALL SELECT 3 id, 10.75 interest_rate, 240 total_balance FROM DUAL 
    5 UNION ALL SELECT 4 id, 11.00 interest_rate, 20 total_balance FROM DUAL 
    6 ) 
    7 SELECT ID, interest_rate 
    8 FROM (SELECT ID, interest_rate, 
    9     SUM(over_limit) 
10     OVER(ORDER BY total_balance DESC) over_limit_no 
11   FROM (SELECT id, 
12       interest_rate, 
13       total_balance, 
14       CASE 
15       WHEN SUM(total_balance) 
16         OVER(ORDER BY total_balance DESC) 
17        /SUM(total_balance) OVER() * 100 < 60 THEN 
18        0 
19       ELSE 
20        1 
21       END over_limit 
22     FROM data 
23     ORDER BY 3)) 
24 WHERE over_limit_no <= 1; 

     ID INTEREST_RATE 
---------- ------------- 
     3   10,75 
     2   10,5 
+0

Большого спасибо за вашу поддержку –

+0

Хорошего «спасибо» также upvote. +1 от меня, Винсент, за ваши усилия! –

 Смежные вопросы

  • Нет связанных вопросов^_^