如何检索max(current_day-1)条记录?

时间:2016-01-11 10:04:37

标签: mysql

2016-01-11是数据库中的最大日期。

,数据库中存在的其他记录是2016-01-08

我试图以这种方式回顾2016-01-08记录

SELECT  *  from historical_data where  current_day = (SELECT max(current_day-1)  from historical_data) order by open_val desc

但我没有结果。

如何检索2016-01-08记录?

http://sqlfiddle.com/#!9/38d3a/1

感谢您的帮助,但在将查询用于我的应用程序时,我在查询中发现了问题

这是我更新的小提琴,sqlfiddle.com /#!! 9 / eaade / 1,使用LIMIT 1时我只能获得一个符号。 ,是否有可能获得每个符号的最后记录 - Preethi Jain

2 个答案:

答案 0 :(得分:2)

试试这个:

SELECT MAX( current_day ) FROM historical_data
WHERE current_day < ( SELECT MAX( current_day )
FROM historical_data )

对于行中的所有数据:

SELECT * FROM historical_data 
WHERE current_day < ( SELECT MAX( current_day ) FROM historical_data ) 
ORDER BY current_day DESC LIMIT 1

答案 1 :(得分:0)

如果您每天有一行,则可以使用此简单查询

SELECT * FROM historical_data ORDER BY current_day DESC LIMIT 1 OFFSET 1

SQLFIDDLE

<强>更新

对于每天有多行的情况,您需要以DENSE_RANKSQL Server中的Oracle查询。

我可以建议两种方法:

1)

SELECT * 
FROM historical_data
WHERE FIND_IN_SET( current_day, (    
SELECT GROUP_CONCAT( DISTINCT current_day ORDER BY current_day DESC ) 
FROM historical_data )
) = 2

SQLFIDDLE

2)

SELECT `symbol_name`, `current_day`, `open_val`, `high_val`,
       `low_val`, `close_val`, `last_val`, `prevclose_val`
FROM
(
    SELECT d.*,
        (CASE WHEN @prev = current_day THEN @rank
         WHEN @prev := current_day THEN @rank := @rank + 1 END) as rank
    FROM historical_data d,
        (SELECT @rank := 0, @prev := null) tmp
    ORDER BY d.current_day DESC
) t
WHERE t.rank = 2

SQLFIDDLE