Postgresql 自上次购买postgres起的天数(每次购买)
只要有一个标准订单表: 订单号 订单日期 客户识别码 订单总数 尝试编写一个查询,生成一列,显示每个客户自上次购买以来的天数。如果客户之前没有订单,则价值为零 我试过这样的方法:Postgresql 自上次购买postgres起的天数(每次购买),postgresql,Postgresql,只要有一个标准订单表: 订单号 订单日期 客户识别码 订单总数 尝试编写一个查询,生成一列,显示每个客户自上次购买以来的天数。如果客户之前没有订单,则价值为零 我试过这样的方法: WITH user_data AS ( SELECT customer_id, order_total, order_date::DATE, ROW_NUMBER() OVER ( PARTITION BY customer_id ORDER BY order_date::DATE DESC )
WITH user_data AS (
SELECT customer_id, order_total, order_date::DATE,
ROW_NUMBER() OVER (
PARTITION BY customer_id ORDER BY order_date::DATE DESC
)
AS order_count
FROM transactions
WHERE STATUS = 100 AND order_total > 0
)
SELECT * FROM user_data WHERE order_count < 3;
我可以将其输入tableau,然后使用一些表计算来处理数据,但我真的很想了解SQL方法。我的方法也只分析最近的两个事务,这是一个缺点
谢谢您表示需要计算自上次购买以来的天数 …尝试编写一个查询,生成一个显示日期的列 自从上次购买以来 所以,基本上你需要为每一个客户在现在和最后一个购买日期之间取得差异。查询可以是以下内容:
-- 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;
你应使用:
要获得自上次订单以来的天数,只需从当前订单日期中减去之前的订单日期:
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将其更改为零。实际上是我的后续问题-谢谢Dmitry~
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