Помогите пожалуйста с запросом

sven_445566
Дата: 15.10.2015 17:08:17
Есть таблица
create table ttt as
select 1 t1, 'a' t2, trunc(sysdate) -1 t3 from dual
union all
select 2 t1, 'b' t2, trunc(sysdate) -1 t3 from dual
union all
select 3 t1, 'c' t2, trunc(sysdate) -1 t3 from dual
union all
select 4 t1, 'b' t2, trunc(sysdate) t3 from dual
union all
select 5 t1, 'c' t2, trunc(sysdate) t3 from dual


Необходимо выбрать строки которые есть "за вчера", но нет за сегодня (в данном примере это строка с t2='a').
Как это наиболее эффективно это сделать, при условии, что таблица приличных размеров, и не хотелось бы просматривать ее несколько раз?

Спасибо.
ArtNick
Дата: 15.10.2015 17:11:24
sven_445566
Есть таблица
create table ttt as
select 1 t1, 'a' t2, trunc(sysdate) -1 t3 from dual
union all
select 2 t1, 'b' t2, trunc(sysdate) -1 t3 from dual
union all
select 3 t1, 'c' t2, trunc(sysdate) -1 t3 from dual
union all
select 4 t1, 'b' t2, trunc(sysdate) t3 from dual
union all
select 5 t1, 'c' t2, trunc(sysdate) t3 from dual


Необходимо выбрать строки которые есть "за вчера", но нет за сегодня (в данном примере это строка с t2='a').
Как это наиболее эффективно это сделать, при условии, что таблица приличных размеров, и не хотелось бы просматривать ее несколько раз?

Спасибо.

Критерий строки (группировки) сообщи, пожалуйста?
sven_445566
Дата: 15.10.2015 17:15:25
ArtNick
Критерий строки (группировки) сообщи, пожалуйста?


t1 - суррогатный PK, генерируется из последовательности при вставке
t2 + t3 - формируют "уникальный ключ"
j2k
Дата: 15.10.2015 17:18:04
sven_445566,

За вчера/сегодня - относительно некой фиксированной даты? Или для каждой строки?
sven_445566
Дата: 15.10.2015 17:20:15
j2k
sven_445566,

За вчера/сегодня - относительно некой фиксированной даты? Или для каждой строки?


Относительно фиксированной даты (параметр передаваемый в процедуру)
JDS
Дата: 15.10.2015 17:29:12
select from where = 'вчера' and not exists 'сегодня'? )
j2k
Дата: 15.10.2015 17:31:26
ну если
sven_445566
t2 + t3 - формируют "уникальный ключ"

и
sven_445566
Относительно фиксированной даты (параметр передаваемый в процедуру)

то можно так:

with t as (
select 1 t1, 'a' t2, trunc(sysdate) -1 t3 from dual
union all
select 2 t1, 'b' t2, trunc(sysdate) -1 t3 from dual
union all
select 3 t1, 'c' t2, trunc(sysdate) -1 t3 from dual
union all
select 4 t1, 'b' t2, trunc(sysdate) t3 from dual
union all
select 5 t1, 'c' t2, trunc(sysdate) t3 from dual
) 
select t2, max(t3)
from t
where t3 between to_date('15.10.2015','dd.mm.yyyy')-1 and to_date('15.10.2015','dd.mm.yyyy')
group by t2
having max(t3)=to_date('15.10.2015','dd.mm.yyyy')-1
sven_445566
Дата: 15.10.2015 17:31:49
JDS
select from where = 'вчера' and not exists 'сегодня'? )


ну.. в итоге хочется примерно так.. но вот как тут подставить предикаты непонятно.. :)
eev
Дата: 15.10.2015 17:33:00
sven_445566
j2k
sven_445566,

За вчера/сегодня - относительно некой фиксированной даты? Или для каждой строки?


Относительно фиксированной даты (параметр передаваемый в процедуру)

SELECT * FROM employees
WHERE hire_date < 
TO_DATE('01-JAN-2004', 'DD-MON-YYYY') -- сегодня, вчера, послезавтра... 
http://docs.oracle.com/database/121/SQLQR/toc.htm
JDS
Дата: 15.10.2015 17:38:22
sven_445566
но вот как тут подставить предикаты непонятно.. :)

Что именно непонятно? )
select *
  from ttt t
 where t3 = to_date('ddmmyyyy', '14102015')
    and not exists (select 1 from ttt where t2 = t.t2 and t3 = to_date('ddmmyyyy', '15102015'))