Oracle选择每条记录的最高日期

时间:2011-06-05 20:27:56

标签: sql oracle11g

对于如何做到这一点,我有点难过。我想从一个表“agency”中选择记录,这些表连接到两个表共享的id列上的表“notes”。

表格结构:

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;

- 每个表都有自动编号,“插入前”触发器,因此id号码保持同步(以及在向新创建的代理商添加注释的情况下的其他内容) - 我需要它做的一切(数据库),确实如此。

- 代理商表中的每个记录都有一个不同的名称/地址组合(在不同城市中有不同的分支),并且备注表中的每个记录都有一个对应于每个代理商的日期条目。

- 每个代理机构都可以有多个备注(后续访问的多个备注详情)

我要做的是选择在过去四个月内没有添加注释的每个(不同的代理商,街道,城市)。

这是我提出的查询:

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 个答案:

答案 0 :(得分:1)

如果我正确理解您的问题,将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;
相关问题