我希望在 Postgres 服务器上提取总和值的前 10%。
所以我用 sum(transaction.value) 对一个值求和,我想要前 10% 的值
我希望在 Postgres 服务器上提取总和值的前 10%。
所以我用 sum(transaction.value) 对一个值求和,我想要前 10% 的值
根据我在您的评论中收集到的信息,我假设您想要:
WITH cte AS (
SELECT t.customer_id, sum(t.value) AS sum_value
FROM transaction t
GROUP BY 1
)
SELECT *, rank() OVER (ORDER BY sum_value DESC) AS sails_rank
FROM cte
ORDER BY sum_value DESC
LIMIT (SELECT count(*)/10 FROM cte)
最好在这里使用 CTE,使计数更便宜。
JOIN
之间customer
和transaction
自动排除没有交易的客户。我在这里假设关系完整性(fk 约束customer_id
)。
除法bigint / int
会有效地截断结果(向下舍入到最接近的整数)。您可能对这个相关问题感兴趣:
PostgreSQL 等价于 TOP n WITH TIES: LIMIT "with ties"?
我添加了一个sails_rank
您没有要求的列,但似乎符合您的要求。
如您所见,我什至没有customer
在查询中包含该表。假设您对 有一个外键约束customer_id
,那将是多余的(而且速度较慢)。如果您想在结果中添加来自客户的其他列,请加入上述查询customer
的结果:
WITH cte AS (
SELECT t.customer_id, sum(t.value) AS sum_value
FROM transaction t
GROUP BY 1
)
SELECT c.customer_id, c.name, sub.sum_value, sub.sails_rank
FROM (
SELECT *, rank() OVER (ORDER BY sum_value DESC) AS sails_rank
FROM cte
ORDER BY sum_value DESC
LIMIT (SELECT count(*)/10 FROM cte)
) sub
JOIN customer c USING (customer_id);