2017-06-14 9 views
0

のために、私は彼らの計画を、サインアップダウングレードおよびアップグレードするユーザーを代表するイベントのデータベースを持って、これまでに合計を実行しています。ユーザーキー、日付キー、プランキーが含まれています。ユーザーの現在のプランを検索するには、ユーザーキーの最新のイベントを検索し、プランキーを使用しても、それに関連付けられたプランを検索します。そして、あなたは、単に各ユーザーのプランの価格を合計MMRを得るためにPostgreSQLは日付ごと

。私はこれを行うために次のSQLを持っています。

SELECT SUM(pl_price) 
FROM (
    SELECT *, ROW_NUMBER() OVER (PARTITION BY t.u_id ORDER BY t.d_iso DESC) rn 
    FROM (
     subscription s INNER JOIN user u ON s.s_userkey = u.u_userkey 
     INNER JOIN plan pl ON s.s_plankey = pl.pl_plankey 
     INNER JOIN date d on s.s_datekey = d.d_datekey 
    ) t 
) t2 
WHERE rn = 1 

私が今したいことは、毎月の歴史的年齢を調べることです。言い換えれば、それは毎月上記のSQLクエリを実行し、それがオンになっている月以降のすべてのイベントを無視する必要があります。

どうすればいいですか? - 購読

s_subkey|s_userkey|s_plankey|s_datekey 
1  |2000  |23  |10 
... 

ユーザー

u_userkey|u_id|u_name|...| 
1  |33 |foo |...| 
... 

計画

pl_plankey|pl_name|pl_price 
1   |aplan |10 
... 

例テーブル:私が試したものは何も...

EDIT作業にも、近くではありません

d_datekey|d_date |d_iso |d_yearmonth|...| 
1  |10-03-2017|*isodate*|Jun2017 |...| 
... 

現在のクエリは、現在の月のMMRを得るために働くので、現時点では6月。私はこのようなテーブルを望みます:

monthyear|mmr 
Jan17 |1000000 
Feb17 |1100000 
Mar17 |1200000 
...  |... 
+1

あなたは、テーブルやカラムの意味を説明する必要があります。サンプルデータを与えると役立ちます。 –

+0

@LaurenzAlbe OKおかげで、私が最も内側のクエリで「選択」、そして可能ならば、内側のクエリ(...) – JMoir

+0

を追加ええおかげ上記クエリは現時点では最適ではありませんが、うまくいきます。私はこれらの提案を念頭に置いています!どのように毎月このクエリを適用するかについての任意のアイデア? – verhie

答えて

0

ここではブルートフォース方式です。これは、関心の数ヶ月を生成し、各月の値を計算し、この情報を使用しています。これはDISTINCT ONはなくROW_NUMBER()使用

SELECT mon, SUM(pl_price) 
FROM (SELECT DISTINCT ON s.uid, g.mon) s.uid, g.mon, pl_price 
     FROM generate_series('2017-01-01'::timestamp, '2017-06-01'::timestamp, interval '1 month') g(mon) CROSS JOIN 
      subscription s INNER JOIN 
      user u 
      ON s.s_userkey = u.u_userkey INNER JOIN 
      plan pl 
      ON s.s_plankey = pl.pl_plankey INNER JOIN 
      date d 
      ON s.s_datekey = d.d_datekey 
     WHERE d.date_key <= g.mon 
     ORDER BY s.uid, g.mon, t.d_iso DESC 
    ) s 
GROUP BY mon 
ORDER BY mon; 

注こと。通常、パフォーマンスは少し速いです。

+0

返信いただきありがとうございます! gテーブルとtテーブルはどこから来ていますか? そしてROW_NUMBER()ではなくDISTINCT ONのノートに感謝します! – JMoir

+0

@JMoir。 。 。テーブルのエイリアスはすべて混乱していました。 't'は' s'、 'g'は' generate_series() 'の結果を参照します。 –

関連する問題