2017-07-07 47 views
1

我需要根據用戶有多少項目來計算收入。 例如,前10個項目是免費的,最多100個項目是0.50,最多200個是0.25,最多500個是0.15。在PostgreSQL中計算累進定價

我不知道從哪裏開始,我可以得到一些方向嗎?

EG。如果用戶有365個項目,這將是(10 * 0)+(90 * 0.5)+(100 * 0.25)+(165 * 0.15)

理想情況下,我會這樣做在python或其他,但儀表板工具沒有這種能力...

編輯: 我應該提到,項目的數量實際上並不是他們擁有的數量,而是他們選擇的限制。該限制在訂閱事件中保存爲單個數字。因此,對於每個用戶,我將有一個整數來表示它們的最大項目,例如365

+1

怎樣的項目和免費數據存儲在數據庫中。如果可能的話,以表格格式添加樣品數據和預期結果 –

回答

2

使用窗口函數的第一個數字項目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 

我應該提到,項目的數量實際上不是他們有 數,這是他們所選擇的限制。該限制在訂閱事件中作爲單個號碼保存爲 。所以對於每個用戶,我會 有一個整數代表他們的最大項目,例如。 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; 
+0

我應該提到物品的數量實際上並不是他們擁有的數量,而是他們選擇的限制。該限制在訂閱事件中保存爲單個數字。因此,對於每個用戶,我將有一個整數來表示它們的最大項目,例如365 – JMoir

+0

我已經更新了我的答案,請參閱。 – krokodilko

+0

是的編輯似乎適合我需要的東西!謝謝 - 你是魔術師。我沒有想到使用generate_series ... – JMoir