Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/71.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 如何从当前日期获取以前的记录?_Sql - Fatal编程技术网

Sql 如何从当前日期获取以前的记录?

Sql 如何从当前日期获取以前的记录?,sql,Sql,我有一个包含当前记录和以前记录的表: | PERIOD | START DATE | END DATE | VAL1 | VAL2 | | 218413 | 25-JAN-19 00:00:00 | 20-MAY-19 00:00:00 | MA | 12 | | 218413 | 25-JAN-19 00:00:00 | 20-MAY-19 00:00:00 | MA | 21 | | 21

我有一个包含当前记录和以前记录的表:

| PERIOD | START DATE | END DATE | VAL1 | VAL2 | | 218413 | 25-JAN-19 00:00:00 | 20-MAY-19 00:00:00 | MA | 12 | | 218413 | 25-JAN-19 00:00:00 | 20-MAY-19 00:00:00 | MA | 21 | | 218413 | 25-JAN-19 00:00:00 | 20-MAY-19 00:00:00 | MA | 32 | | 218512 | 24-JAN-19 00:00:00 | 20-MAY-19 00:00:00 | MA | 14 | | 218402 | 08-AUG-18 00:00:00 | 27-DEC-18 00:00:00 | MA | 15 | | 218402 | 08-AUG-18 00:00:00 | 27-DEC-18 00:00:00 | MA | 24 | | 218782 | 18-APR-18 00:00:00 | 17-JUL-18 00:00:00 | MA | 44 | | 218782 | 18-APR-18 00:00:00 | 17-JUL-18 00:00:00 | MA | 54 | 我正在使用oracledb。旧记录的结束日期和新记录的开始日期之间没有固定的时间间隔。 我想查看基于当前期间的最近旧期间的记录。在上述示例中,当前期间为218413,因此结果应为:

| 218402 | 08-AUG-18 00:00:00 | 27-DEC-18 00:00:00 | MA | 如果我从group by中删除VAL2。 如何在SQL中执行此操作?

Hmmm。您可以使用densite_rank来标识组,然后仅获取前1行或等效行以仅获取一行:

select t.*
from (select t.*,
             dense_rank() over (order by start_date desc) as seqnum
      from t
     ) t
where seqnum = 1
fetch first 1 row only;

请标记正在使用的dbms以及您的尝试。最新的旧记录?在218402期间有2条记录,我们应该选择哪一条?正如@VamsiPrabhala解释的那样,在您告诉我们您使用的是哪种dbms以及MySQL 8.0版本等之前,我们无法回答。@VamsiPrabhala我使用的是Oracle。每个句点和VAL1组合将有多个VAL2值。感谢您的回复。我想我的问题框架不对。我想查看基于当前期间的最近旧期间的记录。在上面的例子中,当前期间是218413,因此结果应该是:| 218402 | 08-AUG-18 00:00:00 | 27-DEC-18 00:00:00 | MA |如果我从group by中删除VAL2。@DebanjanB,它的作用是显而易见的,并且已经在问题本身中。
select "PERIOD" from myTable 
where "START DATE" = 
(Select Min("START DATE") from myTable where "START DATE" > 
(select min("START DATE") from myTable))