我想找到组类型的最新和第二个最新列值差异。并且类型计数必须大于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。
答案 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
)
答案 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
这个想法是给记录一个记录号,每个 type 的值从1再次开始,然后随着降序日期值而增加。
按照日期的类型和降序顺序记录三个变量时保持更新:
所有三个都更新如下:
如果当前记录的类型值与上一条记录相同,那么 @n 会增加1,否则会重置为1。
对于每条记录,还会返回当前记录和上一记录的值之间的差异。
更新类型和值以反映当前记录的值。
最后,只有第二个记录保留在结果集中。