如何获取多个日期之间的平均时间

时间:2019-03-01 11:40:17

标签: mysql

我想做的是根据客户的交易频率来分类他们的客户。我记录了他们每次交易的日期,但是我无法计算出每个日期之间的平均差异。我真正想要的是一张显示我的表格:

| User | Average Frequency
|  1   | 15
|  2   | 15
|  3   | 35
...

我当前拥有的数据的格式如下:

| User | Transaction Date
|  1   | 2018-01-01
|  1   | 2018-01-15
|  1   | 2018-02-01
|  2   | 2018-06-01
|  2   | 2018-06-18
|  2   | 2018-07-01
|  3   | 2019-01-01
|  3   | 2019-02-05
...

因此,基本上,每个客户都会进行多次交易,我想了解如何获取每个日期与平均差额之间的差额。

我知道datediff函数及其功能,但是我不知道如何将它们分开。我也知道offset函数可在Looker之类的工具中使用,但我不知道其背后的语法。

谢谢

3 个答案:

答案 0 :(得分:0)

除了使用GROUP BY外,我不知道该怎么说。

SELECT User, AVG(DATEDIFF(...))
FROM ...
GROUP BY User

答案 1 :(得分:0)

在MySQL 8+中,您可以使用LAG来获取延迟的Transaction Date,然后使用DATEDIFF来获取两个连续日期之间的差。然后,您可以取这些值的平均值:

SELECT User, AVG(delta) AS `Average Frequency`
FROM (SELECT User, 
             DATEDIFF(`Transaction Date`, LAG(`Transaction Date`) OVER (PARTITION BY User ORDER BY `Transaction Date`)) AS delta
      FROM transactions) t
GROUP BY User

输出:

User    Average Frequency
1       15.5
2       15
3       35

Demo on dbfiddle.com

答案 2 :(得分:0)

DROP TABLE IF EXISTS my_table;

CREATE TABLE my_table
(user INT NOT NULL
,transaction_date DATE
,PRIMARY KEY(user,transaction_date)
);

INSERT INTO my_table VALUES
(1,'2018-01-01'),
(1,'2018-01-15'),
(1,'2018-02-01'),
(2,'2018-06-01'),
(2,'2018-06-18'),
(2,'2018-07-01'),
(3,'2019-01-01'),
(3,'2019-02-05');

SELECT user
     , AVG(delta) avg_delta
  FROM 
     ( SELECT x.*
            , DATEDIFF(x.transaction_date,MAX(y.transaction_date)) delta 
         FROM my_table x 
         JOIN my_table y 
           ON y.user = x.user 
          AND y.transaction_date < x.transaction_date 
        GROUP 
           BY x.user
            , x.transaction_date
     ) a
 GROUP
    BY user;
+------+-----------+
| user | avg_delta |
+------+-----------+
|    1 |   15.5000 |
|    2 |   15.0000 |
|    3 |   35.0000 |
+------+-----------+