我有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
答案 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