Запрос в SQL для суммирования n-го по величине столбца - PullRequest
1 голос
/ 19 июня 2019

У меня есть два столбца, которые мне небезразличны YearMonth и Value.

Как можно суммировать 50-е (с 1-го по 50-е, то есть 1-го, 2-го, ..., 50-го) наибольших значений из Value и создавать новый столбец на основе критериев?

Я могу сделать SUM(CASE WHEN Value > 100 THEN Value END) AS LargeValue, но с 1-го по 50-е наибольшее значение меняется каждые YearMonth, поэтому делать это будет не совсем правильно.

Я не смог найти никаких решений для этого, и большинство ответов находит, а не сумму n-го по величине.

Таблица выглядит так (упрощенно):

====================
YearMonth Value Flow
====================
201801   500   10
201801   400   -5
 ...     ...   ...
201802   700   20
201802   100  -20 
201802   50    10

Ответы [ 3 ]

2 голосов
/ 19 июня 2019

Вы можете использовать оконные функции:

select t.*,
       sum(case when seqnum <= 50 then value end) over
           (partition by yearmonth) as top50_sum
from (select t.*,
             row_number() over (partition by yearmonth order by value desc) as seqnum
      from t
     ) t;

Если вы просто хотите одну строку на yearmonth в наборе результатов, используйте group by:

select t.yearmonth, sum(value) as top50_sum
from (select t.*,
             row_number() over (partition by yearmonth order by value desc) as seqnum
      from t
     ) t
where seqnum <= 50
group by yearmonth
0 голосов
/ 19 июня 2019
SELECT t.*, 
       SUM(CASE WHEN t.r < 51 THEN t.value ELSE 0 END) OVER() runningtotal 
  FROM (
         SELECT a.yearmonth, 
                a.value, 
                RANK() OVER (ORDER BY value DESC) r 
           FROM yourtable a ) t 
 ORDER BY t.r asc

Создает порядок ранжированной таблицы, чем создает столбец промежуточной итоги для ранжированной таблицы только для первых 50 элементов.

0 голосов
/ 19 июня 2019

Можно использовать производную таблицу, упорядочив строку по значению по убыванию и ограничив результат до 50 строк. Затем возьмите сумму из этого.

Как пишется ограничение, зависит от СУБД. Во многих из них LIMIT будет работать.

SELECT sum(x.value)
       FROM (SELECT t.value
                    FROM elbat t
                    ORDER BY t.value DESC
                    LIMIT 50) x;
...