2017-03-08 55 views
0

我想知道这是否甚至可以纯粹用MySQL来完成。通过行之间的差异获得前5个结果

排名前5位的列表,在同一数据点的2个不同条目之间进行了最大的改进。

id  | year  | amount 
-------+----------+-------- 
1  | 2016  | 4000 
1  | 2017  | 3000 
2  | 2016  | 12000 
2  | 2017  | 15000 
3  | 2016  | 100 
3  | 2017  | 200 

我基本上需要返回23,按照这个顺序,因为2提高超过3

1不应该是一个结果,因为它在几年之间没有改善。

回答

2

检查在这里:http://rextester.com/TBX28881

select  f1.id, (f2.amount - f1.amount) balance 
from  foot f1 
inner join foot f2 
on   f2.id = f1.id 
and   f2.year = 2017 
where  f1.year = 2016 
order by balance desc 
limit  5; 
; 

id | balance 
---- -------- 
2 3000 
3  100 
1 -1000 
+0

看上去非常简单,比我想象的。谢谢! – eeetee

1

诀窍是将表加入自己。

SELECT y1.id, (y1.amount - y0.amount) AS improvement 
FROM yrtable AS y1 
JOIN yrtable AS y0 ON y0.id = y1.id 
WHERE y0.year = y1.year + 1 
    AND y0.amount > y1.amount 
ORDER BY (y1.amount - y0.amount)