我有一个事件表,每行都有一个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
我的预期结果是代表平均天数的单个数字(我现在意识到这不是上面的查询会给出的)
有什么想法吗?
答案 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
以下是该分布的直方图。
经过的天数平均值为24.4,但中位数为0.而中位数显然是衡量集中趋势的更好方法。如果您不得不下注下一个值是接近0,接近24,还是接近122,那么智能资金将下注为0。
答案 2 :(得分:0)
你需要改变
avg(b.TransactionStartDateTime-a.TransactionStartDateTime)
到
avg(datediff(DAY, a.TransactionStartDateTime, b.TransactionStartDateTime))