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, и далее вторым (ну или еще одним вложенным) запросом тянуть разницу.
Но думаю что это далеко не лучшее решение.
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, и далее вторым (ну или еще одним вложенным) запросом тянуть разницу.
Но думаю что это далеко не лучшее решение.