获取每个subscriber_id的每月最大(日期)记录。每月返回没有重复的ID

时间:2012-12-30 20:30:20

标签: sql oracle oracle11g

我有一个包含列的表(没有索引):unique_idsubscriber_idnotedate_note_created (mm/dd/yyyy hh:mm:ss am)officer_making_notesubscriber_id每月可以有不同人员发出的多个笔记。

我想有效地创建一个视图,其中包含每个subscriber_id每月的单个最后一条记录,其中注释类似于'%some string%'

select * from 
(select subscriber_id, note, date_note_created, officer_making_note
from table
where user_id = v_sub_id
and date_note_created between to_date(v_monthstart, 'mm/dd/yyyy') 
and to_date(v_monthend, 'mm/dd/yyyy')
AND (LOWER (note) LIKE '%z%' 
or (note) LIKE '%a%'
or lower(note) like '%b%' 
or lower(note) like '%c%' 
or lower(note) like '%d%')
order by date_note_created desc)
where rownum = 1;

上面的代码展示了我为一个subscriber_id实现此目的的一个月没有重复的事情。

2 个答案:

答案 0 :(得分:2)

我的猜测是你正在使用Oracle。这使您可以访问分析函数。

由于您正在寻找多个月和所有订阅者,因此我删除了where子句中的月限制和订阅者ID。我还添加了一个月标识符(作为“YYYY-MM”格式的字符串):

select *
from (select subscriber_id, note, date_note_created, officer_making_note, to_char(date_note_created, 'YYYY-MM') as mon
             row_number() over (partition by subscriber_id, to_char(date_note_created, 'YYYY-MM')
                                order by date_note_created desc) as seqnum
      from table
      where /* user_id = v_sub_id and */
            /* date_note_created between to_date(v_monthstart, 'mm/dd/yyyy') and to_date(v_monthend, 'mm/dd/yyyy') AND */
            (LOWER (note) LIKE '%z%' or (note) LIKE '%a%' or lower(note) like '%b%' or lower(note) like '%c%' or lower(note) like '%d%'
            )
     )
where seqnum = 1

要创建视图,只需使用create view as语句。

答案 1 :(得分:0)

尝试使用ROW_NUMBER窗口函数,如下所示:

select *
from ( 
   select subscriber_id
        , note, date_note_created, officer_making_note
        , ROW_NUMBER () OVER (PARTITION BY subscriber_id
                              ORDER BY date_note_created DESC) as rn
   from table
   where user_id = v_sub_id
      and date_note_created between to_date(v_monthstart, 'mm/dd/yyyy') 
      and to_date(v_monthend, 'mm/dd/yyyy')
      and (   lower(note) LIKE '%z%' 
           or lower(note) LIKE '%a%'
           or lower(note) like '%b%' 
           or lower(note) like '%c%' 
           or lower(note) like '%d%')
   )  xx
where rn = 1;