AVG увеличение записей по сравнению с предыдущим годом - PullRequest
0 голосов
/ 14 мая 2019

AVG увеличение записей на основе предыдущего года

  SELECT TO_CHAR (Application_Date, 'yyyy'), 
         COUNT (*)
    FROM Services
GROUP BY TO_CHAR (Application_Date, 'yyyy')
ORDER BY 1 DESC;

AVG увеличение записей на основе предыдущего года

пример:

2018 ----- 3000 records - 50% increase
2017 ----- 2000 records - 100% increase

2016 ----- 1000 records - 0% increase

1 Ответ

2 голосов
/ 14 мая 2019

Предполагая, что ссылка на средние значения - красная сельдь, а ваш 35% -ный пример - опечатка ...

Вы хотите сравнить значения из двух строк, чтобы вы могли использовать функцию lag()для просмотра данных за предыдущий год:

LAG(COUNT(*)) OVER (ORDER BY TO_CHAR (Application_Date, 'yyyy'))

Затем рассчитайте процентное изменение как обычно, используя счет текущего года и счет предыдущего года:

SELECT TO_CHAR (Application_Date, 'yyyy') AS year,
  COUNT(*) AS year_count,
  100 * (COUNT(*) - LAG(COUNT(*)) OVER (ORDER BY TO_CHAR (Application_Date, 'yyyy')))
    / LAG(COUNT(*)) OVER (ORDER BY TO_CHAR (Application_Date, 'yyyy')) AS percentage_change
FROM Services
GROUP BY TO_CHAR (Application_Date, 'yyyy')
ORDER BY 1 DESC;

YEAR YEAR_COUNT PERCENTAGE_CHANGE
---- ---------- -----------------
2018       5000                25
2017       4000                 0
2016       4000                  

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

Вы также можете использовать CTE или встроенное представление, чтобы выполнить лаг только один раз:

SELECT year,
  year_count,
  100 * (year_count - prev_year_count) / prev_year_count AS percentage_change
FROM (
  SELECT TO_CHAR (Application_Date, 'yyyy') AS year,
    COUNT(*) AS year_count,
    LAG(COUNT(*)) OVER (ORDER BY TO_CHAR (Application_Date, 'yyyy')) AS prev_year_count
  FROM Services
  GROUP BY TO_CHAR (Application_Date, 'yyyy')
)
ORDER BY 1 DESC;

Лично при использовании значений года я склонен трактовать их как числа, а не строки, поэтому яиспользовал экстракт:

select year,
  year_count,
  100 * (year_count - prev_year_count) / prev_year_count as percentage_change
from (
  select extract(year from application_date) as year,
    count(*) as year_count,
    lag(count(*)) over (order by extract(year from application_date)) as prev_year_count
  from services
  group by extract(year from application_date)
)
order by 1 desc;

      YEAR YEAR_COUNT PERCENTAGE_CHANGE
---------- ---------- -----------------
      2018       5000                25
      2017       4000                 0
      2016       4000                  

дБ <> скрипка

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...