Немного догадываюсь, что типы данных не ясны, но что-то вроде этого может сработать (например, использование CTE для создания фиктивных данных):
with events as (
select 'report1' as report, '01/01/2012' as date_field, '0800' as time_field
from dual
union all select 'report1', '01/01/2012', '0900' from dual
union all select 'report1', '01/02/2012', '0930' from dual
union all select 'report2', '01/01/2012', '0900' from dual
union all select 'report2', '01/01/2012', '0900' from dual
union all select 'report2', '01/01/2012', '1000' from dual
)
select report, date_field, time_field
from (
select report, date_field, time_field,
row_number() over (partition by report
order by to_date(date_field, 'MM/DD/YYYY'), time_field) as rn
from events
)
where rn = 1
order by report;
REPORT DATE_FIELD TIME
------- ---------- ----
report1 01/01/2012 0800
report2 01/01/2012 0900
Возможно, у вас другая маска формата даты;Я предположил, что в американском формате вы упомянули «военное время».
В зависимости от того, как вы хотите относиться к связям, вам понадобится rank
или dense_rank
вместо row_number
.См. Документацию аналитические функции для получения дополнительной информации.Как указал Джастин, вы, вероятно, хотите rank
, который с теми же данными дает:
REPORT DATE_FIELD TIME
------- ---------- ----
report1 01/01/2012 0800
report2 01/01/2012 0900
report2 01/01/2012 0900
Внутренний выбор добавляет дополнительный столбец rn
, который присваивает ранжирование каждому результату;каждое значение report
будет иметь по крайней мере одну строку, которой присваивается 1
(если используется rank
, в противном случае ровно одна), и, возможно, строки с 2
, 3
и т. д. Одна или несколько строк с 1
будет иметь самую раннюю дату / время для этого отчета.Внешний запрос затем фильтрует до only , отображая ранжированные 1
с помощью предложения where rn = 1
, следовательно, предоставляя данные только с самой ранней датой / временем для каждого report
- остальное отбрасывается.