Oracle Выбрать самую высокую дату для каждой записи - PullRequest
1 голос
/ 06 июня 2011

Я немного озадачен тем, как это сделать. Я хочу выбрать записи из таблицы «агентство», соединенной с таблицей «заметки» в столбце идентификатора, который разделяют две таблицы.

Структура таблицы:

create table notes (
    notes_id varchar2(5),
    agency_gp_id varchar2(5),
    call_date date,
    call_note varchar2(4000)
);

create table agency(
    agency_id varchar2(5),
    agency_name varchar2(5),
    street varchar2(75),
    city varchar2(50)
);

alter table notes add constraint "fk_group_notes_agency_id" foreign key(agency_gp_id)
    references agency(agency_id) enable;

- Каждая таблица имеет автоматическую нумерацию, триггеры «перед вставкой», поэтому номера идентификаторов остаются синхронизированными (наряду с другими вещами в случае добавления заметки во вновь созданное агентство) - все, что мне нужно для этого ( база данных), это делает.

-Каждая запись из таблицы агентства имеет отдельное комбинированное имя / адрес (с разными филиалами в разных городах), и каждая запись из таблицы заметок имеет запись даты, соответствующую каждому агентству.

-Каждое агентство может иметь несколько заметок (несколько записей примечаний от последующих посещений)

То, что я пытаюсь сделать, - это выбрать каждое (отдельное агентство, улицу, город), к которому в течение последних четырех месяцев не было добавлено примечание.

Это мой запрос:

SELECT count(a.agency_name) as number_of_visits,
    a.agency_name,
    (a.street||', '||a.city) as "Location", 
    n.call_date,
    ROUND(TRUNC(sysdate - call_date)) AS days_since_visit
FROM notes n, agency a
WHERE (sysdate - n.call_date) > 120
    AND n.agency_gp_id = a.agency_id
    --AND a.city = 'München' --not necessary, used for limiting number of results
GROUP BY n.call_date,a.agency_name,a.street, a.city
ORDER BY a.agency_name ASC, n.call_date desc;

Это вроде работает ... Я вижу то, что хочу, но я также вижу то, что НЕ хочу (например, несколько заметок в каждом агентстве). Единственное, что я хочу увидеть, - это последняя запись (самая последняя, ​​согласно предложению WHERE) каждого агентства. Картинка, которую я хочу создать: для любого агентства, которое не было аннотировано в течение 120 дней с момента последней заметки, отобразите адрес, имя и дату последней заметки. (Вместо того, чтобы показывать количество дней, прошедших с КАЖДОГО посещения, я хочу показать количество дней, прошедших с момента последнего посещения - для отдельного агентства, улицы, города).

Это приложение, которое поможет руководителю отдела продаж планировать ее продажи и запускается два раза в неделю. Я не смог понять это. Кроме того, имейте в виду, что используемые таблицы являются гораздо более описательными - здесь я использовал только те части, которые мне нужны для описания вопроса.

Буду признателен за любые предложения по решению этой проблемы.

Спасибо!

1 Ответ

1 голос
/ 06 июня 2011

Если я правильно понимаю вашу проблему, изменение call_date на MAX (call_date) (и удаление его из оператора GROUP BY) должно дать вам то, что вы хотите в терминах данных, но также вызовет ложные срабатывания, а именно любое агентство, которое были заметки старше 120 дней, независимо от самой последней заметки. Если мы отфильтруем эти агентства в подзапросе NOT EXISTS, это приведет вас туда, куда вам нужно.

SELECT count(a.agency_name) as number_of_visits,
    a.agency_name,
    (a.street||', '||a.city) as "Location", 
    MAX(n.call_date),
    ROUND(TRUNC(sysdate - MAX(call_date))) AS days_since_visit
FROM notes n, agency a
WHERE (sysdate - n.call_date) > 120
    AND n.agency_gp_id = a.agency_id
    AND NOT EXISTS (SELECT 1 FROM notes n2 
                    WHERE n2.agency_gp_id = a.agency_id 
                    AND (sysdate - n2.call_date) <= 120)
    --AND a.city = 'München' --not necessary, used for limiting number of results
GROUP BY a.agency_name,a.street, a.city
ORDER BY a.agency_name ASC, MAX(n.call_date) desc;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...