Sql 检查客户在上次订单后的12个月内是否没有下过其他订单

Sql 检查客户在上次订单后的12个月内是否没有下过其他订单,sql,postgresql,Sql,Postgresql,CREATE TABLE customers ( id SERIAL PRIMARY KEY, order_date DATE, customer VARCHAR(255) ); INSERT INTO customers (order_date, customer) VALUES ('2020-05-10', 'user_01'), ('2020-05-15', 'user_01'), ('2020-05-18', 'user_02'), ('2020-05-26'

CREATE TABLE customers (
    id SERIAL PRIMARY KEY,
    order_date DATE,
    customer VARCHAR(255)
);

INSERT INTO customers
(order_date, customer)
VALUES 
('2020-05-10', 'user_01'),
('2020-05-15', 'user_01'),
('2020-05-18', 'user_02'),
('2020-05-26', 'user_03'),

('2020-06-12', 'user_04'),
('2020-06-19', 'user_05'),
('2020-06-23', 'user_06'),


('2021-05-09', 'user_01'),
('2021-05-17', 'user_07'),

('2021-06-03', 'user_04'),
('2021-06-18', 'user_05'),
('2021-06-20', 'user_08');
预期结果:

churn_date    |   customer   |
--------------|--------------|----
2021-05-18    |   user_02    |
2021-05-26    |   user_03    |
--------------|--------------|-----
2021-06-23    |   user_06    |

我想提取所有

a) 正好12个月前有订单,
b) 自此订单之后,您再也没有订购过

在一个月的时间里,我可以通过以下查询解决此问题:

SELECT
(c1.order_date + interval '12 month')::date as churn_date,
c1.customer
FROM customers c1
WHERE c1.order_date BETWEEN '2020-05-01 00:00:00' AND '2020-05-31 23:59:59'

AND NOT EXISTS

   (SELECT
    c2.customer
    FROM customers c2
    WHERE c2.order_date BETWEEN '2020-06-01 00:00:00' AND '2021-05-31 23:59:59'
    AND c2.customer = c1.customer)
    
ORDER BY 1,2;
但是,与每月单独查询不同,我更喜欢迭代数据并给出多个月结果的解决方案

我需要如何修改我的查询来实现这一点

检查客户在上次订单后的12个月内是否没有下过其他订单

这就回答了问题。只需使用
groupby
have

SELECT c.customer,
       MAX(c.order_date + interval '12 month')::date as churn_date
FROM customers c
GROUP BY c.customer
HAVING MAX(c.order_date) < CURRENT_DATE - interval '12 month';

这是一个骗局。

结果毫无意义。例如,“user_06”在过去12个月内(截至2021年5月)有一个订单,因此不属于结果。是的,这是正确的观点,但我认为您的答案可以同时满足两种可能的结果。仅用于我的文档:
SELECT gs.month, c.customer, MAX(c.order_date + interval '12 month')::date as churn_date
FROM customers c CROSS JOIN
     GENERATE_SERIES('2021-05-01'::date, '2021-06-01'::date, interval '1 month') gs(month)
GROUP BY gs.month, c.customer
HAVING DATE_TRUNC('month', MAX(c.order_date)) = DATE_TRUNC('month', gs.month) - interval '12 month';