下表如下:
name  value  year
 A      1    2015
 A      2    2014
 A      3    2013
 B      1    2015
 B      3    2013
 C      1    2015
 C      2    2014对于每一个名字,我如何才能得到第二个最高年份的行,比如:
name  value  year
 A      2    2014
 B      3    2013
 C      2    2014我尝试了以下查询,但没有成功:
select name, value, year
from TABLE_NAME
WHERE year IN (select year from TABLE_NAME order by year desc limit 1,1)上一次查询给了我这个错误:"SQL (1235):这个版本的MySQL还不支持‘限制& IN/ALL/ANY/SOME子查询’“。
我现在无法更改MySQL版本(5.6.25),因为解决方案已经在生产中了。
有什么帮助吗?
发布于 2016-07-19 17:40:46
在MySQL中求解n个组的一种方法是模拟ROW_NUMBER。请注意,这将只返回每个名称的一个值。
SELECT 
    name, 
    value,
    year
FROM 
    (SELECT 
        t.name, 
        t.value,
        t.year,
        @rn := if(@prev = t.name, @rn + 1,1) as rn,
        @prev:=t.name
    FROM
        test_table as t
        JOIN (SELECT @Prev:= Null, @Rn := 0) as v
    ORDER BY 
        t.name,
        T.year desc) as t
WHERE
    rn = 2;这是怎么回事。
SELECT @Prev:= Null, @Rn := 0初始化两个变量@Prev和@Rn。@rn := if(@prev = t.name, @rn + 1,1) as rn根据if @prev = t.Name将变量@rn设置为1或@rn +1,并将@rn的值作为列rn返回。@prev:=t.name设置@prev的值等于名称的当前值如果你跑
SELECT 
    t.name, 
    t.value,
    t.year,
    @prev = t.name as eval,
    @rn := if(@prev = t.name, @rn + 1,1) as rn,
    @prev:=t.name as prev
FROM
    test_table as t
    JOIN (SELECT @Prev:= Null, @Rn := 0) as v
ORDER BY 
    t.name,
    T.year desc我希望像这样的事情
name  value  year  eval  rn  prev
 A      1    2015  false  1  null
 A      2    2014  true   2  A
 A      3    2013  true   3  A
 B      1    2015  false  1  A
 B      3    2013  true   2  B
 C      1    2015  false  1  B
 C      2    2014  true   2  C包装到子查询中,对rn=2的筛选将给出所需的结果
https://stackoverflow.com/questions/38464884
复制相似问题