最新和第二列值

时间:2016-04-23 11:43:00

标签: mysql

我想找到组类型的最新和第二个最新列值差异。并且类型计数必须大于1。

在我的表中考虑这个示例数据:

/login

我希望结果是

type  value        date
--------------------------------
 2       5   2015-05-09 12:42:00
 4     -42   2015-05-09 13:19:57
 2       2   2015-05-09 14:48:30
 2       7   2015-05-09 12:54:39
 3      16   2015-05-09 13:19:57
 3      20   2015-05-09 15:01:09

即,对于类型2,最新值为2,第二个最新值为7,因此它们之间的差值为-5。

2 个答案:

答案 0 :(得分:0)

select t1.type, t1.value - t2.value as value
from mytable t1
join mytable t2 using(type)
where t1.date = (
    select max(date) 
    from mytable t1m 
    where t1m.type = t1.type
  )
  and t2.date = (
    select max(date)
    from mytable t2m
    where t2m.type = t1.type
      and t2m.date <> t1.date
  )

http://www.sqlfiddle.com/#!2/5a3298/2

答案 1 :(得分:0)

您可以使用变量来减少所需的表扫描次数:

SELECT   type, 
         value
FROM (  SELECT   @n := IF(type = @t,  @n+1, 1) as num,
                 @t := type                    as type,
                 @v - value                    as value,
                 @v := value
        FROM     mytable
        ORDER BY type, 
                 date DESC) base
WHERE   num = 2

SQL Fiddle

这个想法是给记录一个记录号,每个 type 的值从1再次开始,然后随着降序日期值而增加。

按照日期的类型和降序顺序记录三个变量时保持更新:

  • @n :给上一条记录的记录号;
  • @t :上一条记录中 type 列的值;
  • @v :以前记录中列的值;

所有三个都更新如下:

如果当前记录的类型值与上一条记录相同,那么 @n 会增加1,否则会重置为1。

对于每条记录,还会返回当前记录和上一记录的之间的差异。

更新

类型以反映当前记录的值。

最后,只有第二个记录保留在结果集中。