我有一个 Oracle 表,其中包含名称、值、时间列。基本上,该表用于记录目的,以存储对特定名称所做的更改、以前的值是什么以及进行更改的时间。

我需要制定一个查询来获取特定名称的前 n 个更改,并且输出应该包含表中的所有名称。 有什么帮助/建议吗?

编辑:

Name         Value     Time 
Harish       Pass      1-Nov-2011 
Ravi         Fail      2-Nov-2011 
Harish       Absent    31-Oct-2011 
Harish       Attended  31-Aug-2011  
Harish       Present   31-Jul-2011 

我需要在 11 月 1 日、10 月 31 日、8 月 31 日和 Ravi 选择 Harish 的详细信息。

请您参考如下方法:

这就是你想要的吗?

我的测试设置:

SQL> alter session set nls_date_format = 'DD-Mon-YYYY HH24:Mi:SS'; 
 
Session altered. 
 
SQL> drop table so_test; 
 
Table dropped. 
 
SQL> create table so_test  ( 
  2    n varchar2(32) 
  3  , v varchar2(32) 
  4  , t date ); 
 
Table created. 
 
SQL>  
SQL> insert into so_test values ( 'X' , 'Test1', to_date('01-Jan-2011 12:00:00','DD-Mon-YYYY HH24:Mi:SS') ); 
 
1 row created. 
 
SQL> insert into so_test values ( 'X' , 'Test2', to_date('01-Jan-2011 13:00:00','DD-Mon-YYYY HH24:Mi:SS') ); 
 
1 row created. 
 
SQL> insert into so_test values ( 'X' , 'Test3', to_date('01-Jan-2011 14:00:00','DD-Mon-YYYY HH24:Mi:SS') ); 
 
1 row created. 
 
SQL> insert into so_test values ( 'Y' , 'Test5', to_date('02-Jan-2011 12:00:00','DD-Mon-YYYY HH24:Mi:SS') ); 
 
1 row created. 
 
SQL> insert into so_test values ( 'Y' , 'Test6', to_date('03-Jan-2011 12:00:00','DD-Mon-YYYY HH24:Mi:SS') ); 
 
1 row created. 
 
SQL> insert into so_test values ( 'Y' , 'Test7', to_date('04-Jan-2011 12:00:00','DD-Mon-YYYY HH24:Mi:SS') ); 
 
1 row created. 
 
SQL>  

这里是查询:

SQL> select n,v,t from ( 
  2  select n, v , t , rank() over ( partition by n order by t desc) r 
  3  from so_test 
  4  ) where r <= 2; 
 
N                V                T 
-------------------------------- -------------------------------- -------------------- 
X                Test3                01-Jan-2011 14:00:00 
X                Test2                01-Jan-2011 13:00:00 
Y                Test7                04-Jan-2011 12:00:00 
Y                Test6                03-Jan-2011 12:00:00 
 
SQL>  


评论关闭
IT序号网

微信公众号号:IT虾米 (左侧二维码扫一扫)欢迎添加!