自上次购买postgres后的天数(每次购买)

时间:2015-09-11 18:39:26

标签: postgresql

只需要一个标准订单表:

  • order_id
  • order_date
  • customer_id
  • ORDER_TOTAL

尝试编写一个查询,为每个客户生成一列显示自上次购买以来的日期。如果客户没有先前的订单,则该值将为零。

我尝试过这样的事情:

<input type="radio" onclick="myfunction()" />

我可以将其添加到tableau中,然后使用一些表计算来处理数据,但我真的想了解SQL方法。我的方法也只分析最近的两笔交易,这是一个缺点。

由于

2 个答案:

答案 0 :(得分:0)

您表示您需要计算自上次购买以来的天数

  

..尝试编写一个生成显示日期的列的查询   自上次购买以来

因此,基本上您需要在每个客户的现在和最后购买日期之间取得差异。查询可以如下:

-- test DDL
CREATE TABLE orders (
  order_id SERIAL PRIMARY KEY,
  order_date DATE,
  customer_id INTEGER,
  order_total INTEGER
);

INSERT INTO orders(order_date, customer_id, order_total) VALUES
  ('01-01-2015'::DATE,1,2),
  ('01-02-2015'::DATE,1,3),
  ('02-01-2015'::DATE,2,4),
  ('02-02-2015'::DATE,2,5),
  ('03-01-2015'::DATE,3,6),
  ('03-02-2015'::DATE,3,7);

WITH orderdata AS (
    SELECT customer_id,order_total,order_date,
      (now()::DATE - max(order_date) OVER (PARTITION BY customer_id)) as days_since_purchase
    FROM orders
    WHERE order_total > 0
)
SELECT DISTINCT customer_id ,days_since_purchase FROM orderdata ORDER BY customer_id;

答案 1 :(得分:0)

您应该使用lag() function

select *, 
    lag(order_date) over (partition by customer_id order by order_date) 
    as prior_order_date
from transactions
order by order_id

要获得自上次订单以来的天数,只需从当前订单日期中减去先前的订单日期:

select *, 
    order_date- lag(order_date) over (partition by customer_id order by order_date)
    as days_since_last_order
from transactions
order by order_id

如果没有先前的订单,查询会选择null。您可以使用coalesce()将其更改为零。