【问题标题】:AVG interval length for table with purchases购买表的 AVG 间隔长度
【发布时间】:2018-09-19 23:09:10
【问题描述】:

对于如下所示的表格,我将不胜感激:

  client_id | transaction_date | amount
  -------------------------------------
      123   |     2017-01-16   |   12
      234   |     2017-01-11   |   25 
      345   |     2017-01-12   |  211

我想获得同一客户进行下一次交易的一段时间内的平均值 - 换句话说 - 导致某个用户进行下一次交易的平均天数是多少?

我在想一些 TIMESTAMPDIFF,但不知道在这种情况下如何实现。

【问题讨论】:

  • 您能否提供一些示例数据的预期结果?
  • 您正在运行/愿意运行哪个 MySQL 版本? MySQL-8.0/MariaDB-10.2 中的递归 CTE 使这类查询更容易。

标签: mysql sql date average


【解决方案1】:

最简单的方法是取最大值和最小值之间的差,然后除以行数。

所以:

select client_id,
       ( datediff(max(transaction_date), min(transaction_date)) /
         nullif(count(*) - 1, 0)
       ) as avg_duration
from t
group by client_id;

因为您正在处理日期,所以您可以使用 datediff() 而不是 timestampdiff()(节省您的函数参数)。

【讨论】:

    【解决方案2】:

    这样做

    SELECT client_id,avg(DATEDIFF(transaction_date,next_transaction_date)) FROM
    (
        SELECT 
        client_id,
        transaction_date ,
        LEAD(transaction_date,1) OVER (
            PARTITION BY client_id
            ORDER BY transaction_date) next_transaction_date
        FROM 
        table    
    ) as s WHERE next_transaction_date is not null
    

    这里是了解LEAD功能的参考链接

    http://www.mysqltutorial.org/mysql-window-functions/mysql-lead-function/

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-02-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多