2017-07-07 12 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などで行います。ダッシュボードツールにはその機能がありません...

EDIT: アイテムの数は実際にはそれらの数ではなく、選択した制限です。制限は、サブスクリプション・イベントで単一の番号として保管されます。だから各ユーザーのために、私は最大の項目を表す整数を持っています。 365

+1

データベースに格納されてどのように項目やフリーのデータ。可能であれば、サンプルデータと予想される結果を表形式 –

答えて

2

ウィンドウ関数を使用する最初の数値項目row_number
各項目に適切な値を割り当てるためにケース式を使用します。
簡単な例: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

関連する問題