如何将最后一个记录值与oracle sql select查询中的所有prvious记录进行比较

时间:2016-11-16 10:33:59

标签: oracle

我有oracle表,其值如下所示。

f_name            f_size                f_date
abc.csv           100                   2016-08-01 10:55:55
abc.csv           200                   2016-08-01 11:55:55
abc.csv           300                   2016-08-01 12:55:55
abc.csv           400                   2016-08-01 14:55:55

我的要求是我想在f_size和f_date的基础上比较最后一个值和所有先前的值,如果最后一个记录f_size大于所有先前的值(f_size值),最后一个f_date是最大值,即max(date)然后所有先前的日期然后一个记录将在输出中,在上面的情况下将输出以下。

abc.csv           400                   2016-08-01 14:55:55

1 个答案:

答案 0 :(得分:1)

你可能想要这样的东西。注意 - 我添加了更多测试数据(在不符合条件的情况下添加了另一个f_name编辑:以及另一种最大文件大小不唯一的情况。

这假设您需要查询为每个f_name单独工作,相反,它应该在所有文件名中相同,只需将partition by f_name更改为partition by null

修改:修改了解决方案,以排除最大尺寸和最大日期的文件与文件的其他版本具有相同大小的情况。

with
     test_data ( f_name, f_size, f_date ) as (
       select 'abc.csv', 100, to_date('2016-08-01 10:55:55', 'yyyy-mm-dd hh24:mi:ss') from dual union all
       select 'abc.csv', 200, to_date('2016-08-01 11:55:55', 'yyyy-mm-dd hh24:mi:ss') from dual union all
       select 'abc.csv', 300, to_date('2016-08-01 12:55:55', 'yyyy-mm-dd hh24:mi:ss') from dual union all
       select 'abc.csv', 400, to_date('2016-08-01 14:55:55', 'yyyy-mm-dd hh24:mi:ss') from dual union all
       select 'efg.txt', 200, to_date('2016-08-12 04:30:00', 'yyyy-mm-dd hh24:mi:ss') from dual union all
       select 'efg.txt', 100, to_date('2016-08-12 05:00:00', 'yyyy-mm-dd hh24:mi:ss') from dual union all
       select 'hij.log', 800, to_date('2016-08-16 05:05:00', 'yyyy-mm-dd hh24:mi:ss') from dual union all
       select 'hij.log', 100, to_date('2016-08-16 05:30:00', 'yyyy-mm-dd hh24:mi:ss') from dual union all
       select 'hij.log', 800, to_date('2016-08-12 05:00:00', 'yyyy-mm-dd hh24:mi:ss') from dual
     ),
-- end of test data; solution (SQL query) begins below this line 
-- (add the keyword WITH to the beginning of the query below)
     prep ( f_name, f_size, f_date, max_size, max_date ) as  (
       select f_name, f_size, f_date, 
              max(f_size) over (partition by f_name),
              max(f_date) over (partition by f_name)
       from   test_data
     )
select f_name, f_size, f_date
from   prep
where f_size = max_size and f_date = max_date
  and f_name in ( select   f_name 
                  from     prep 
                  where    f_size = max_size 
                  group by f_name 
                  having   count(*) = 1
                )
;  

F_NAME   F_SIZE   F_DATE
-------  ------   -------------------
abc.csv     400   2016-08-01 14:55:55