下表如下:
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的筛选将给出所需的结果
发布于 2016-07-19 17:48:23
我的策略是使用分组来寻找最高的年份。然后与原始表一起删除最高年份。最后,在组合表上进行分组,以查找每个名称的第二个最高年份。(如果您需要value,可以使用原始表进行INNER JOIN查找。)
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 ;发布于 2016-07-19 17:33:30
试试这个:
select * from test_table where year = (select distinct year from test_table order by year desc limit 1,1)https://stackoverflow.com/questions/38464884
复制相似问题