循环记录不同的消费者'返回日期之间的天数

时间:2017-01-10 18:16:16

标签: sql oracle cursor

我一直在查看循环记录的问题,但一直无法找到任何可以解决我问题的内容

所以我在广告系列中有一张消费者条目表。 profile_id特定于消费者,这里我们有两个消费者。我们看到他们输入的广告系列和参赛日期,计数告诉我们哪个条目(按时间顺序排列)

profile_id    campaign   create_date    entry      
74704338      2320        28-07-2015      1
74704338      2388        28-01-2016      2
74704338      2464        29-04-2016      3
74704338      2476        03-05-2016      4
74704338      2505        25-05-2016      5
81990916      2320        05-11-2015      1
81990916      2388        22-01-2016      2
81990916      2464        28-04-2016      3
81990916      2467        28-04-2016      4
81990916      2434        02-05-2016      5

我想要做的是遍历每个配置文件(消费者)的每条记录并获得最大值。 n和n + 1条目之间的天数,以及与之关联的广告系列。

因此,对于profile_id 74704338,我们应该得到以下内容,因为1到2之间的天数是序列中最大的,而广告系列2388是他们在此时间过后输入的广告系列

profile_id    campaign   num_days
74704338      2388       184

同样对于81990916我们应该

profile_id    campaign   num_days
81990916      2464       97

我认为我将使用声明语句来执行此操作,但不知道从哪里开始。非常感谢您的帮助

非常感谢

2 个答案:

答案 0 :(得分:0)

为这种练习创建了分析函数。首先我们计算差异(使用profile_id函数),然后计算每个“分区”中with test_data ( profile_id, campaign, create_date ) as ( select 74704338, 2320, to_date('28-07-2015', 'dd-mm-yyyy') from dual union all select 74704338, 2388, to_date('28-01-2016', 'dd-mm-yyyy') from dual union all select 74704338, 2464, to_date('29-04-2016', 'dd-mm-yyyy') from dual union all select 74704338, 2476, to_date('03-05-2016', 'dd-mm-yyyy') from dual union all select 74704338, 2505, to_date('25-05-2016', 'dd-mm-yyyy') from dual union all select 81990916, 2320, to_date('05-11-2015', 'dd-mm-yyyy') from dual union all select 81990916, 2388, to_date('22-01-2016', 'dd-mm-yyyy') from dual union all select 81990916, 2464, to_date('28-04-2016', 'dd-mm-yyyy') from dual union all select 81990916, 2467, to_date('28-04-2016', 'dd-mm-yyyy') from dual union all select 81990916, 2434, to_date('02-05-2016', 'dd-mm-yyyy') from dual ), diffs ( profile_id, campaign, create_date, diff ) as ( select profile_id, campaign, create_date, create_date - lag(create_date) over (partition by profile_id order by create_date) from test_data ), with_max ( profile_id, campaign, create_date, diff, max_diff ) as ( select profile_id, campaign, create_date, diff, max(diff) over (partition by profile_id) from diffs ) select profile_id, campaign, create_date, diff from with_max where diff = max_diff ; PROFILE_ID CAMPAIGN CREATE_DATE DIFF ---------- --------- ----------- ----- 74704338 2388 28-01-2016 184 81990916 2464 28-04-2016 97 2 rows selected. 的最大差异,然后在最后(最外面)查询中我们选择差异等于最大。

我是使用Oracle 11.2及更高版本的语法编写的。对于早期版本,可以通过在子查询定义中创建列别名(而不是在其声明中)来重写它。

def makeVector(self, wordString):
        """ @pre: unique(vectorIndex) """

        #Initialise vector with 0's
        vector = [0] * len(self.vectorKeywordIndex)
        wordList = self.parser.tokenise(wordString)
        wordList = self.parser.removeStopWords(wordList)
        for word in wordList:
                vector[self.vectorKeywordIndex[word]] += 1; #Use simple Term Count Model
        return vector

答案 1 :(得分:0)

这是获取记录的另一种方式。成本是5.算术答案成本是22。

select *
  from (select *
          from (select profile_id,
                       campaign_id,create_date,
                       (create_date - lag(create_date, 1, create_date)
                        OVER(PARTITION BY profile_id ORDER BY ENTRY
                             NULLS LAST)) nod
                  from campaign)
         order by nod desc)
 where rownum <= 2