在 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;
我需要根据用户拥有的商品数量来计算收入。 例如,前 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;