组之间相同字段中日期之间的平均时间

efl*_*s89 4 sql sql-server average datediff date

我有一个包含销售数据和用户ID的交易数据库,如下所示:

id_usuarioweb   dt_fechaventa
1551415         2015-08-01 14:57:21.737
1551415         2015-08-06 15:34:21.920
6958538         2015-07-30 09:26:24.427
6958538         2015-08-05 09:30:06.247
6958538         2015-08-31 17:39:02.027
39101175        2015-08-05 16:34:17.990
39101175        2015-09-20 20:37:26.043
1551415         2015-09-05 13:41:43.767
3673384         2015-09-06 13:34:23.440
Run Code Online (Sandbox Code Playgroud)

我想计算数据库中同一客户的日期之间的平均差异(找出用户购买的平均频率).

我知道我可以使用两列进行约会,但是我在尝试在同一个字段中执行此操作并按用户ID"分组"时遇到问题.

期望的结果是这样的:

id_usuarioweb   avgtime_days
1551415         5
6958538         25
39101175        25
1551415         0
3673384         0
Run Code Online (Sandbox Code Playgroud)

我怎样才能做到这一点?我将按user_id和dt_fechaventa(销售时间)排序数据库.

使用:SQL Server 2008

Gre*_*ers 6

我认为你要找的是这样计算的.取最大和最小日期,得到它们之间的差异并除以购买数量.

SELECT id_usuarioweb, CASE 
        WHEN COUNT(*) < 2
            THEN 0
        ELSE DATEDIFF(dd, 
                MIN(
                    dt_fechaventa
                ), MAX(
                    dt_fechaventa
                )) / (
                COUNT(*) - 
                1
                )
        END AS avgtime_days
FROM mytable
GROUP BY id_usuarioweb
Run Code Online (Sandbox Code Playgroud)

编辑:(由@GordonLinoff)

如果你看一下数学,很容易看出这是正确的.考虑三个日期,a,b和c.

他们之间的平均时间是:

((b - a) + (c - b)) / 2
Run Code Online (Sandbox Code Playgroud)

这简化为:

(c - a) / 2
Run Code Online (Sandbox Code Playgroud)

换句话说,中间值取消.并且,无论中间值的数量如何,这都会继续.

  • @eflores89。. . 平均值是最大值减去最小值除以计数小一。这是计算该值的最简单和最好的方法。 (2认同)