获取SQL中连续日期列表之间的平均时间

时间:2013-05-16 15:07:39

标签: sql sql-server sql-server-2008 tsql

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

表格基本上就是这样。

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

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

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

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

有什么想法吗?

3 个答案:

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

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

以下是该分布的直方图。

Histogram of elapsed days between successive events

经过的天数平均值为24.4,但中位数为0.而中位数显然是衡量集中趋势的更好方法。如果您不得不下注下一个值是接近0,接近24,还是接近122,那么智能资金将下注为0。

答案 2 :(得分:0)

你需要改变

avg(b.TransactionStartDateTime-a.TransactionStartDateTime) 

avg(datediff(DAY,  a.TransactionStartDateTime, b.TransactionStartDateTime))