这是我的第一篇文章,所以请原谅我有任何格式错误。
我需要为大量用户找到每行数据之间的时间,然后将这些时间的平均值作为时间的函数。我知道如何做后一部分,我只是不知道如何找到行之间的时差。
例如,我可以非常轻松地生成此输出(对于所有用户,只需使用' John'作为示例):
User order time
John 13 2013-10-31 22:35:19
John 12 2013-10-18 23:16:50
John 11 2012-12-07 00:38:34
John 10 2012-06-10 02:19:14
John 9 2010-07-02 00:55:54
John 8 2009-12-20 23:43:41
John 7 2009-12-20 01:14:32
John 6 2009-12-18 15:12:40
John 5 2009-12-13 00:38:38
John 4 2009-12-12 16:00:13
John 3 2009-12-12 14:50:18
John 2 2009-12-11 18:41:15
John 1 2009-12-04 03:12:06
但是,我需要知道如何做到这一点:
User order time timeDiff
John 13 2013-10-31 22:35:19 13
John 12 2013-10-18 23:16:50 300
John 11 2012-12-07 00:38:34 170
John 10 2012-06-10 02:19:14 ...
John 9 2010-07-02 00:55:54 ...
John 8 2009-12-20 23:43:41 ...
John 7 2009-12-20 01:14:32 ...
John 6 2009-12-18 15:12:40 ...
John 5 2009-12-13 00:38:38 ...
John 4 2009-12-12 16:00:13 ...
John 3 2009-12-12 14:50:18 ...
John 2 2009-12-11 18:41:15 ...
John 1 2009-12-04 03:12:06 NULL
这很容易在excel中完成,但我需要用户+日期的分组属性才能进行一些分析。
所有帮助赞赏!!
答案 0 :(得分:1)
试试这个
Select current.time - previous.time As TimeDiff
From UserTable current Join
UserTable previous On current.User = pervious.User And current.Order - 1 = previous.Order
Where current.User = 'John'
那会让你有时间差异。 你说你知道如何从那里获得平均值。
答案 1 :(得分:0)
就像你说的,在Excel中很容易。在SQL中引用相对行非常困难,特别是在MySQL中。
您必须使用服务器端变量来建立“状态”,因此您可以记住以前的值。 e.g。
SET prev := null;
SELECT User, Order, time, IF(@prev IS NOT NULL, time - @prev, null), @prev := time;
由于您为多个用户执行此操作会变得更加困难,并且必须添加额外的代码以检测用户何时更改。
对于这种事情,你最好在客户端代码中进行计算。这意味着:
SELECT User, Order, UNIX_TIMESTAMP(time)
...
ORDER BY User, Order
然后您可以将这些时间戳直接提供给PHP的时间系统进行格式化/计算。