MySQL在不同行之间的时间作为聚合

时间:2014-07-07 16:48:47

标签: mysql sql database date

这是我的第一篇文章,所以请原谅我有任何格式错误。

我需要为大量用户找到每行数据之间的时间,然后将这些时间的平均值作为时间的函数。我知道如何做后一部分,我只是不知道如何找到行之间的时差。

例如,我可以非常轻松地生成此输出(对于所有用户,只需使用' 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中完成,但我需要用户+日期的分组属性才能进行一些分析。

所有帮助赞赏!!

2 个答案:

答案 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的时间系统进行格式化/计算。