只需要一个标准订单表:
尝试编写一个查询,为每个客户生成一列显示自上次购买以来的日期。如果客户没有先前的订单,则该值将为零。
我尝试过这样的事情:
<input type="radio" onclick="myfunction()" />
我可以将其添加到tableau中,然后使用一些表计算来处理数据,但我真的想了解SQL方法。我的方法也只分析最近的两笔交易,这是一个缺点。
由于
答案 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()
将其更改为零。