在 PostgreSQL 中计算累进定价

Calculating progressive pricing in PostgreSQL

我需要根据用户拥有的商品数量来计算收入。 例如,前 10 件免费,最多 100 件是 0.50,最多 200 件是 0.25,最多 500 件是 0.15。

我不知道从哪里开始,请问我能得到一些指导吗?

EG。如果用户有 365 个项目,则为 (10 * 0) + (90 * 0.5) + (100 * 0.25) + (165 * 0.15)

理想情况下,我会在 python 或其他时间执行此操作,但仪表板工具没有该功能...

编辑: 我应该提到项目的数量实际上并不是他们拥有的数量,而是他们选择的限制。该限制在订阅事件中保存为单个数字。因此,对于每个用户,我将有一个整数代表他们的最大项目,例如。 365

使用 window 函数的第一个项目 row_number,
然后使用 case 表达式为每个项目分配适当的值。
简单示例:http://sqlfiddle.com/#!17/32e4a/9

SELECT user_id,
 SUM(
    CASE
       WHEN rn <= 10 THEN 0
       WHEN rn <= 100 THEN 0.5
       WHEN rn <= 200 THEN 0.25
       WHEN rn <= 500 THEN 0.15
       ELSE 0.05
    END
   ) As revenue 
FROM (
  SELECT *,
    row_number() OVER (partition by user_id order by item_no ) As rn
  FROM mytable
) x
GROUP BY user_id

I should have mentioned that the number of items isn't actually the number they have, it's the limit they have chosen. The limit is saved as a single number in a subscription event. So for each user I will have an integer representing their max items eg. 365

在这种情况下,以下查询可能符合您的需要:
演示:http://sqlfiddle.com/#!17/e7a6a/2

SELECT *,
      (SELECT SUM(
          CASE
             WHEN rn <= 10 THEN 0
             WHEN rn <= 100 THEN 0.5
             WHEN rn <= 200 THEN 0.25
             WHEN rn <= 500 THEN 0.15
             ELSE 0.05
           END
            ) 
          FROM generate_series(1,t.user_limit) rn
       )
FROM mytab t;