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

时间:2015-09-22 17:42:59

标签: sql sql-server date average datediff

我有一个包含销售数据和用户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

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

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

期望的结果是这样的:

id_usuarioweb   avgtime_days
1551415         5
6958538         25
39101175        25
1551415         0
3673384         0

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

使用:SQL Server 2008

2 个答案:

答案 0 :(得分: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

编辑:(来自@GordonLinoff)

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

他们之间的平均时间是:

((b - a) + (c - b)) / 2

这简化为:

(c - a) / 2

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

答案 1 :(得分:1)

您可以先使用Protocol 'Channel' can only be used as a generic constraint because it has Self or associated type requirements对行进行编号,然后使用row_number进行self-join。然后执行cte。但是,每个用户将获得一行,但不会按预期结果获得。

average