2017-03-24 10 views
1

PostgreSQLクエリでRFM解析を作成しようとしています。しかし、私はRecencyディメンションのクエリを完全に完了していません。この記事 リーセンシー次元の「https://cooldata.wordpress.com/2014/03/25/an-all-sql-way-to-automate-rfm-scoring/
基準に触発 問合せは、2ヶ月以内にPostgresqlを使用したRFM解析

  1. ラストオーダーだった= 5
  2. 4ヶ月= 4
  3. ラストオーダー6内の内
  4. ラストオーダーヶ月= 3
  5. 8ヶ月以内
  6. ラストオーダー= 2
  7. 10ヶ月以内
  8. 最終順序= 1
以下

とは私が終えるしようとしてきたクエリです

WITH rfm AS 

(SELECT email, 
SUM((total_incl_tax)) AS cash, 
MAX(decode(order_order.order_date, 2016-01-01, 5, 2016-02-01, 4, 2016-03-01, 3, 2016-04-01, 2, 201605-01, 1)) AS recency, 
COUNT(DISTINCT(order_date)) AS frequency 
FROM order_order 

GROUP BY email) 


SELECT rfm.email, 
CASE 
WHEN rfm.cash >= 2000000 THEN 5 
WHEN rfm.cash > 1500000 THEN 4 
WHEN rfm.cash > 1000000 THEN 3 
WHEN rfm.cash > 500000 THEN 2 
WHEN rfm.frequency > 4 THEN 5 
WHEN rfm.frequency = 4 THEN 4 
WHEN rfm.frequency = 3 THEN 3 
WHEN rfm.frequency = 2 THEN 2 
WHEN rfm.frequency = 1 THEN 1 
else 1 

END + rfm.frequency AS rfm_score 
--+ Five_years.recency 

FROM rfm 
GROUP BY rfm.email, rfm.cash,rfm.frequency 
ORDER BY rfm.email 

エラーだった:

ERROR: function decode(timestamp with time zone, integer, integer, integer, integer, integer, integer, integer, integer, integer, integer) does not exist Hint: No function matches the given name and argument types. You might need to add explicit type casts. Position: 186 

と私はエラーが

MAX(decode(order_order.order_date, 2016-01-01, 5, 2016-02-01, 4, 2016-03-01, 3, 2016-04-01, 2, 2016-05-01, 1)) AS recency 

があります。このラインにあったと仮定リーセンシーディメンションに記載されている基準にエラーラインを変更する際の提案はありますか?ありがとう

+0

ここで、[Postgresのマニュアルで](https://www.postgresql.org/docs/current/static/functions。 html) 'decode()'関数を見つけましたか? –

答えて

1

Postgresにはdecode()の機能はありません。あなたは別のCASE声明でこれを置き換えることができます:ここ

WITH rfm AS 
(
    SELECT email, 
    SUM((total_incl_tax)) AS cash, 
    MAX(
     CASE 
      WHEN order_order.order_date = '2016-01-01' THEN 5 
      WHEN order_order.order_date = '2016-02-01' THEN 4 
      WHEN order_order.order_date = '2016-03-01' THEN 3 
      WHEN order_order.order_date = '2016-04-01' THEN 2 
      WHEN order_order.order_date = '2016-05-01' THEN 1 
     END 
     ) as recency, 
    COUNT(DISTINCT(order_date)) AS frequency 
    FROM order_order 
    GROUP BY email 
) 
SELECT rfm.email, 
CASE 
    WHEN rfm.cash >= 2000000 THEN 5 
    WHEN rfm.cash > 1500000 THEN 4 
    WHEN rfm.cash > 1000000 THEN 3 
    WHEN rfm.cash > 500000 THEN 2 
    WHEN rfm.frequency > 4 THEN 5 
    WHEN rfm.frequency = 4 THEN 4 
    WHEN rfm.frequency = 3 THEN 3 
    WHEN rfm.frequency = 2 THEN 2 
    WHEN rfm.frequency = 1 THEN 1 
    else 1 
END + rfm.frequency + rfm.recency AS rfm_score 
FROM rfm 
GROUP BY rfm.email, rfm.cash,rfm.frequency 
ORDER BY rfm.email 

さらに読書:Decode equivalent in postgres