Нужна помощь с решением задачи.

virakochi

Устал
Нужна помощь с решением задачи.

Oracle 9.2

Есть две таблички:
1. ttfile:
subscriber_id varchar2(30), imei varchar2(15), call_date_time date.
2. subs_imei:
subscriber_id varchar2(30), imei varchar2(15).

Необходимо оптимально выбрать из ttfile такие последние по времени (call_date_time) пары (subscriber_id, imei) в рамках заданного периода времени, для которых нет соответствующей пары в subs_imei.

Таблицы очень большие.

То есть я понимаю, что нужен outer join по паре subscriber_id, imei с сортировкой по call_date_time и группировкой. Но не совсем вижу как это сделать.

Спасибо за помощь.

-~{}~ 20.01.06 16:48:

Да, забыл написать, в первой таблице индексы по (subscriber_id, call_date_time) и (imei), во второй по subscriber_id

Придумал вариант:

[sql]
SELECT b.subscriber_id, b.imei, b.call_date_time
FROM (
SELECT max(call_date_time) AS "last_time", subscriber_id FROM ttfile
WHERE call_date_time between to_date('20060110000000', 'YYYYMMDDHH24MISS') AND to_date('20060110235959', 'YYYYMMDDHH24MISS')
GROUP BY subscriber_id) a,
ttfile b
WHERE a.subscriber_id = b.subscriber_id AND a."last_time" = b.CALL_DATE_TIME
[/sql]

Получаем все последние по каждому subscriber_id, и далее вторым (ну или еще одним вложенным) запросом тянуть разницу.

Но думаю что это далеко не лучшее решение.
 

Buteo

[CDR/DVP]
Re: Нужна помощь с решением задачи.

задание
Автор оригинала: virakochi
...Необходимо выбрать из ttfile такие последние по времени (call_date_time) пары (subscriber_id, imei)...
не стыкуется с этим вариантом
в запросе у тебя выбираются ВСЕ варианты пары имеи с последним ID...

как варинат, хотя дома базы нету - не запускал - может не работать :D
PHP:
   select 
     m.subscriber_id
    ,m.imei
   from 
     (
       select 
          subscriber_id
         ,imei
       from
         (
           select 
              subscriber_id
             ,imei
             ,row_number() over (partition by subscriber_id, imei order by call_date_time desc) as rn
           from ttfile
           where call_date_time > :FromDate
             and call_date_time < :ToDate
         )
       where rn = 1
     ) m
     left join subs_imei i on
         i.subscriber_id = m.subscriber_id
     and i.imei = m.imei
   where i.subscriber_id is null
з.ы. такие вопросы лучше на http://sql.ru/ задавать...
 
Сверху