Как получить соотношение сумм 10% вверху и внизу каждой категории из таблицы?

У меня есть таблица employees со столбцами id, category, salary. Я хочу получить соотношение сумм заработной платы 10% лучших и худших сотрудников каждой категории. Количество сотрудников каждой категории разное.

╔══════╤════════╤════════╗
║id    │category│salary  ║
╠══════╪════════╪════════╣
║102329│1       │8995.00 ║
╟──────┼────────┼────────╢
║102330│2       │10069.00║
╟──────┼────────┼────────╢
║102331│2       │10076.00║
╟──────┼────────┼────────╢
║102332│3       │10516.00║
╟──────┼────────┼────────╢
║102334│3       │9285.00 ║
╟──────┼────────┼────────╢
║102335│3       │9786.00 ║
╟──────┼────────┼────────╢
║102336│1       │9056.00 ║
╟──────┼────────┼────────╢
║102337│4       │5695.00 ║
╟──────┼────────┼────────╢
║102338│4       │5369.00 ║
╟──────┼────────┼────────╢
║102339│3       │10499.00║
╟──────┼────────┼────────╢
║102340│3       │7540.00 ║
╟──────┼────────┼────────╢
║102341│3       │8245.00 ║
╟──────┼────────┼────────╢
║102342│3       │10089.00║
╟──────┼────────┼────────╢
║102343│4       │5631.00 ║
╟──────┼────────┼────────╢
║102344│4       │5674.00 ║
╟──────┼────────┼────────╢
║102345│3       │8607.00 ║
╚══════╧════════╧════════╝
0
0
27
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

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

WITH salaries AS (
    SELECT category, 
           salary
           NTILE(10) OVER (PARTITION BY category ORDER BY SALARY asc) AS decile
    FROM   employees
)
SELECT   category,
         SUM(salary) FILTER (WHERE decile = 1) /
         SUM(salary) FILTER (WHERE decile = 10) AS ratio
FROM     salaries
GROUP BY category

Другие вопросы по теме