当前位置: 首页 > 面试题库 >

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

滕无尘
2023-03-14
问题内容

我有这张桌子:

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尚不支持’LIMIT&IN / ALL / ANY / SOME子查询’”

而且我现在无法更改MySQL版本(5.6.25),因为该解决方案已经投入生产。

有什么帮助吗?


问题答案:

在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 将@rn的变量设置为1或@rn + 1,具体取决于@prev = t.Name并返回@rn的值作为列rn
  • @prev:=t.name 将@prev的值设置为等于name的当前值

如果你跑

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获得所需的结果



 类似资料:
  • 问题内容: 在Python中,如何获取二进制值和的所有组合? 例如,如果我想要 我怎样才能做到这一点? 问题答案: 采用 这将产生一个元组列表(请参阅此处) 您可以轻松地将其更改为使用变量: 如果需要列表列表,则可以使用该功能(感谢@Aesthete)。 或在Python 3中: 请注意,使用或列表理解意味着您无需将产品转换为列表,因为它将迭代对象并产生一个列表。

  • 它返回的第一个日期,我是一个菜鸟在正则表达式,所以请帮助我,谢谢

  • 问题内容: 我有一个包含两个字段的表(价格),代码(字符)和价格(十进制)。我需要找到具有相同代码的所有记录,价格要低5倍或少于两个最高价。 EG在这种情况下,我希望删除id = 1: 问题答案:

  • 问题内容: 我想知道实时有多少用户连接到我的应用程序。我想到了要打开的会话数循环的想法,但是我找不到该怎么做的方法。如果您有另一种方法可以提出您的建议。 问题答案: 到目前为止,我发现的最佳解决方案是计算会话的创建和销毁时间。 然后在VaadinServlet init()方法中添加SessionListeners

  • 假设我有这个数组: 我想得到第二个< code>99的位置,类似于: 然而,中的第二个参数只是告诉从哪里开始搜索。有没有任何内置函数来实现这一点?如果没有,你会怎么做? 谢谢

  • 你好,我一直在尝试自动化监控一个站点,但它“响应”多个文档,我想知道如何浏览他们或选择哪一个我想要分析。 代码非常简单: 站点这样“回应”: 它不允许我发布图片,但这里有链接: 如何选择不同的单据而不是第一个单据?