首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何获得第二高值的所有行

如何获得第二高值的所有行
EN

Stack Overflow用户
提问于 2016-07-19 17:26:43
回答 4查看 256关注 0票数 3

下表如下:

代码语言:javascript
运行
复制
name  value  year
 A      1    2015
 A      2    2014
 A      3    2013
 B      1    2015
 B      3    2013
 C      1    2015
 C      2    2014

对于每一个名字,我如何才能得到第二个最高年份的行,比如:

代码语言:javascript
运行
复制
name  value  year
 A      2    2014
 B      3    2013
 C      2    2014

我尝试了以下查询,但没有成功:

代码语言:javascript
运行
复制
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),因为解决方案已经在生产中了。

有什么帮助吗?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2016-07-19 17:40:46

在MySQL中求解n个组的一种方法是模拟ROW_NUMBER。请注意,这将只返回每个名称的一个值。

代码语言:javascript
运行
复制
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的值等于名称的当前值

如果你跑

代码语言:javascript
运行
复制
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

我希望像这样的事情

代码语言:javascript
运行
复制
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的筛选将给出所需的结果

票数 3
EN

Stack Overflow用户

发布于 2016-07-19 17:48:23

我的策略是使用分组来寻找最高的年份。然后与原始表一起删除最高年份。最后,在组合表上进行分组,以查找每个名称的第二个最高年份。(如果您需要value,可以使用原始表进行INNER JOIN查找。)

代码语言:javascript
运行
复制
SELECT name, MAX(year)
FROM
    (SELECT name, year
        FROM TABLE_NAME) AS x1
    INNER JOIN
    (SELECT name, MAX(year) AS year
        FROM TABLE_NAME
        GROUP BY name, year
    ) AS x2
    ON x1.name = x2.name AND x1.year <> x2.year
GROUP BY name
ORDER BY name ASC ;
票数 1
EN

Stack Overflow用户

发布于 2016-07-19 17:33:30

试试这个:

代码语言:javascript
运行
复制
 select * from test_table where year = (select distinct year from test_table order by year desc limit 1,1)
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38464884

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档