简体   繁体   English

SQL datediff没有datediff?

[英]SQL Datediff without datediff?

I have the following data sample with 3 columns: 我有以下包含3列的数据示例:

Customer_ID; 顾客ID; Customer_Class; Customer_Class; Purchase_day 采购日

How can I calculate the average days between purchases for each class of customers? 如何计算每个类别客户的两次购买之间的平均天数?

I have tried using a CTE, but I can´t really figure out how can I use some sort of datediff here: 我已经尝试过使用CTE,但是我真的无法弄清楚如何在这里使用某种datediff:

WITH recency_cte --(SalesPersonID, SalesOrderID, SalesYear)
AS
-- Define the CTE query.
(
    SELECT Customer_ID, Customer_class, purchase_day
    FROM transactions_table b join customer_table a on customer_id=b.customer_id
    group by Customer_ID, Customer_class, purchase_day
    order by purchase_day asc
)
-- Define the outer query referencing the CTE name.
SELECT customer_class, avg(datediff(call_day)
FROM recency_cte
group by a.comm

Thanks. 谢谢。

This might help. 这可能会有所帮助。 Note that it will be a bit limited, only returning customers who have made purchases on at least two different days. 请注意,这会有所限制,仅回访的顾客至少在两个不同的日期进行过购买。 I've included some (commmented out) sample data so you can see what I'm expecting the underlying data to look like. 我包含了一些(注释掉的)样本数据,因此您可以看到我期望的基础数据看起来像什么。 I also made the assumption that customer_class is unique to customer_id: ie, each customer_id has only one customer_class. 我还假设customer_class对于customer_id是唯一的:即,每个customer_id只有一个customer_class。 If that's not true, you'll need to add customer_class to the JOIN condition between the two CTEs. 如果不是这样,则需要将customer_class添加到两个CTE之间的JOIN条件中。

WITH recency_cte --(SalesPersonID, SalesOrderID, SalesYear)
AS
-- Define the CTE query.
(
    SELECT Customer_ID, Customer_class, purchase_day, ROW_NUMBER() OVER (PARTITION BY Customer_ID ORDER BY purchase_day) AS RowNumber
    FROM transactions_table b join customer_table a on customer_id=b.customer_id
     -- (
        --SELECT 1 Customer_ID, 'a' Customer_Class, '6/01/2014' Purchase_Day
        --UNION 
        --SELECT 2 Customer_ID, 'b' Customer_Class, '6/03/2014' Purchase_Day
        --UNION 
        --SELECT 2 Customer_ID, 'b' Customer_Class, '6/04/2014' Purchase_Day
        --UNION 
        --SELECT 2 Customer_ID, 'b' Customer_Class, '6/05/2014' Purchase_Day
        --UNION 
        --SELECT 2 Customer_ID, 'b' Customer_Class, '6/08/2014' Purchase_Day
        --UNION 
        --SELECT 2 Customer_ID, 'b' Customer_Class, '6/12/2014' Purchase_Day
        --UNION 
        --SELECT 1 Customer_ID, 'a' Customer_Class, '6/12/2014' Purchase_Day
     -- )s
    GROUP BY Customer_ID, Customer_class, purchase_day
)
-- Define the outer query referencing the CTE name.
SELECT Day1.customer_class, avg(datediff(day, Day1.Purchase_Day, Day2.Purchase_Day)) AverageDaysBetweenPurchases
FROM 
    recency_cte Day1
     INNER JOIN 
    recency_cte Day2 ON 
        Day1.Customer_ID = Day2.Customer_ID AND 
        Day1.RowNumber + 1 = Day2.RowNumber
group by Day1.Customer_Class

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM