4

我有一个事件表,每一行都有一个 StartDateTime 列。我需要查询事件的子集(例如通过用户 ID)并确定连续事件之间的平均天数。

桌子基本上是这样的。

TransactionID   TransactionStartDateTime
----------------------------------------
277             2011-11-19 11:00:00.000
278             2011-11-19 11:00:00.000
279             2012-03-20 15:19:46.160
288             2012-03-20 19:23:06.507
289             2012-03-20 19:43:41.980
291             2012-03-20 19:55:17.523

我试图调整此问题中引用的以下查询:

select a.TransactionID, b.TransactionID, avg(b.TransactionStartDateTime-a.TransactionStartDateTime) from
     (select *, row_number() over (order by TransactionStartDateTime) rn from Transactions) a
join (select *, row_number() over (order by TransactionStartDateTime) rn from Transactions) b on (a.rn=b.rn-1)
group by
a.TransactionID, b.TransactionID

但是我在这里没有任何运气,因为原始查询不期望 DateTimes

我的预期结果是代表平均天数的一位数(我现在意识到这不是上面的查询所给出的)

有任何想法吗?

4

3 回答 3

1

如果您的预期结果是代表平均天数的一位数。尝试这个 :

SELECT  AVG(DATEDIFF(DAY, a.TransactionStartDateTime,
                 b.TransactionStartDateTime))
FROM    ( SELECT    * ,
                ROW_NUMBER() OVER ( ORDER BY TransactionStartDateTime ) rn
      FROM      Transactions
    ) a
    JOIN ( SELECT   * ,
                    ROW_NUMBER() OVER ( ORDER BY TransactionStartDateTime ) rn
           FROM     Transactions
         ) b ON ( a.rn = b.rn - 1 )
于 2013-05-16T17:00:08.587 回答
1

我不知道哪个答案最适合您的情况。但是您的问题提出了一个问题,我认为数据库开发人员(以及一般的程序员)应该更加注意。

取平均值很容易,但平均值通常是集中趋势的错误度量。

transactionid  start_time               end_time                 elapsed_days
--
277            2011-11-19 11:00:00      2011-11-19 11:00:00      0
278            2011-11-19 11:00:00      2012-03-20 15:19:46.16   122
279            2012-03-20 15:19:46.16   2012-03-20 19:23:06.507  0
288            2012-03-20 19:23:06.507  2012-03-20 19:43:41.98   0
289            2012-03-20 19:43:41.98   2012-03-20 19:55:17.523  0
291            2012-03-20 19:55:17.523     

这是该分布的直方图。

连续事件之间经过天数的直方图

经过天数的平均值为 24.4,但中位数为 0。中位数显然是这里集中趋势的更好衡量标准。如果你必须赌下一个值是接近 0、接近 24 还是接近 122,那么聪明的钱会赌 0。

于 2013-05-17T01:05:50.080 回答
0

你需要改变

avg(b.TransactionStartDateTime-a.TransactionStartDateTime) 

avg(datediff(DAY,  a.TransactionStartDateTime, b.TransactionStartDateTime))
于 2013-05-16T15:20:48.250 回答