3

我希望在 Postgres 服务器上提取总和值的前 10%。

所以我用 sum(transaction.value) 对一个值求和,我想要前 10% 的值

4

1 回答 1

4

根据我在您的评论中收集到的信息,我假设您想要:

  1. 对每个客户的交易求和以获得每个客户的总数。
  2. 列出实际进行交易并花费最多的前 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之间customertransaction自动排除没有交易的客户。我在这里假设关系完整性(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);
于 2013-10-14T10:20:59.537 回答