首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在滚动的12个月上迭代生成的序列.红移的基础

在滚动的12个月上迭代生成的序列.红移的基础
EN

Stack Overflow用户
提问于 2021-05-24 10:46:32
回答 1查看 52关注 0票数 0

DB-Fiddle

代码语言:javascript
复制
CREATE TABLE customers (
    id SERIAL PRIMARY KEY,
    order_date DATE,
    customer VARCHAR(255)
);

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

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


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

('2021-04-03', 'user_02'),
('2021-04-18', 'user_05'),
('2021-04-20', 'user_08');

预期结果:

代码语言:javascript
复制
churn_date    |   customer   |
--------------|--------------|----
2021-03-18    |   user_02    |
2021-03-26    |   user_03    |
--------------|--------------|-----
2021-04-12    |   user_04    |
2021-04-23    |   user_06    |

如果来自客户的最后一次订单是12个月前下的,我想通过12-months-rolling-basis对每个月的客户进行迭代。

例如:

user_02应该出现在March的结果中,而不应该出现在April的结果中。

March看来,上一次订单发生在12个月前的2020-03-18上。

April看来,最后一次订单发生在2021-04-03上。

postgresSQL中,我可以通过这个问题的解决方案来实现这一点。

代码语言:javascript
复制
SELECT 
gs.month AS month, 
c.customer AS customer, 
MAX(c.order_date + interval '12 month')::date as churn_date
FROM customers c 

    CROSS JOIN
    GENERATE_SERIES('2021-03-01'::date, '2021-04-01'::date, interval '1 month') AS gs(month)

WHERE c.order_date < gs.month + interval '1 month'
GROUP BY 1,2
HAVING DATE_TRUNC('month', MAX(c.order_date)) = DATE_TRUNC('month', gs.month) - interval '12 month';

但是,在amazon-redshift中,我得到一个错误,即GENERATE_SERIES函数不存在。

如何修改查询以使其在amazon-redshift中工作

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-05-24 10:48:39

在Redshift中,您需要显式地定义表。有一种方法是在线的:

代码语言:javascript
复制
SELECT gs.month AS month, c.customer AS customer, 
       MAX(c.order_date + interval '12 month')::date as churn_date
FROM customers c CROSS JOIN
     (SELECT '2021-03-01'::date as month UNION ALL
      SELECT '2021-04-01'::date as month UNION ALL
      . . .
     ) gs
WHERE c.order_date < gs.month + interval '1 month'
GROUP BY 1, 2
HAVING DATE_TRUNC('month', MAX(c.order_date)) = DATE_TRUNC('month', gs.month) - interval '12 month';

您还可以玩其他的把戏--例如,如果您有一个日历表或数字表,或者真正有12行的任何表:

代码语言:javascript
复制
FROM customers c CROSS JOIN
     (SELECT (date + (ROW_NUMBER() OVER () - 1) * INTERVAL '1 MONTH') as month 
      FROM (SELECT '2012-03-01'::date as date
            FROM <any table with 12 rows>
            LIMIT 12
           ) gs
      LIMIT 12
     ) gs
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67670734

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档