我一直在查看循环记录的问题,但一直无法找到任何可以解决我问题的内容
所以我在广告系列中有一张消费者条目表。 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
我认为我将使用声明语句来执行此操作,但不知道从哪里开始。非常感谢您的帮助
非常感谢
答案 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