有一个表存放点击记录:序号id , 杂志id,杂志期号,读者id,点击时间
例如 1 1001 01 555 2007.3.6
2 1001 01 555 2007.3.7
3 1001 08 555 2007.3.7
4 1005 06 888 2007.3.5
5 ………………………………………………想把这些数据整理一下,提取出每个用户最后浏览的5条记录,要求同读者id,相同杂志期id 多次点击算一次 使用oracle语法
例如 1 1001 01 555 2007.3.6
2 1001 01 555 2007.3.7
3 1001 08 555 2007.3.7
4 1005 06 888 2007.3.5
5 ………………………………………………想把这些数据整理一下,提取出每个用户最后浏览的5条记录,要求同读者id,相同杂志期id 多次点击算一次 使用oracle语法
select row_number() over (partition by 读者id,杂志id,杂志期号 order by 读者id,杂志id,杂志期号,点击时间 desc) rn,t.*
from Table where rn<=5
from Table t where rn<=5t是表的別名,再試試
select * from (
select row_number() over (partition by 读者id,杂志id,杂志期号 order by 读者id,杂志id,杂志期号,点击时间 desc) rn,t.*
from Table t)
where rn<=5
select row_number() over (partition by 读者id order by 点击时间 desc) rn,t.*
from Table t)
where rn<=5
(select 杂志ID,杂志期号,读者ID,
row_number() over (partition by 杂志id,杂志期号,读者id order by 杂志id,杂志期号,读者id,点击时间 desc) as 序号,点击时间
from table_name)
Where 序号<=5其中的table_name请自行替换吧
是一条记录 杂志A,第一期,路人甲,1次
还是两条记录 杂志A,第二期,路人甲,1次 呢?
杂志A,第一期,路人甲,1次
要求不同统计方法不一样哦!
m_id varchar2(4),
q_id varchar2(2),
u_id varchar2(3),
dt varchar2(8));
1001,01,555,'2007.3.6');
insert into t values(
1001,01,555,'2007.3.7');
insert into t values(
1001,08,555,'2007.3.7');
insert into t values(
1001,08,555,'2007.3.9');
insert into t values(
1002,01,555,'2007.3.6');
insert into t values(
1002,01,555,'2007.3.5');
insert into t values(
1002,03,555,'2007.3.4');
insert into t values(
1008,01,555,'2007.3.4');
insert into t values(
1008,01,555,'2007.3.9');
insert into t values(
1008,01,555,'2007.3.4');
insert into t values(
1008,03,555,'2007.3.4');
insert into t values(
1008,03,555,'2007.3.5'); insert into t values(
1001,01,888,'2007.3.6');
insert into t values(
1001,01,888,'2007.3.7');
insert into t values(
1001,08,888,'2007.3.7');
insert into t values(
1001,08,888,'2007.3.9');
insert into t values(
1002,01,888,'2007.3.6');
insert into t values(
1002,01,888,'2007.3.5');
insert into t values(
1002,03,888,'2007.3.4');
insert into t values(
1002,03,888,'2007.3.7');
insert into t values(
1008,01,888,'2007.3.7');
insert into t values(
1008,01,888,'2007.3.8');
insert into t values(
1008,03,888,'2007.3.4');
insert into t values(
1008,03,888,'2007.3.5');insert into t values(
1001,01,666,'2007.3.6');
insert into t values(
1001,01,666,'2007.3.7');
insert into t values(
1001,08,666,'2007.3.7');
insert into t values(
1001,08,666,'2007.3.9');
insert into t values(
1002,01,666,'2007.3.6');
insert into t values(
1002,01,666,'2007.3.5');
insert into t values(
1002,03,666,'2007.3.4');
insert into t values(
1002,03,666,'2007.3.8');
insert into t values(
1008,01,666,'2007.3.9');
insert into t values(
1008,01,666,'2007.3.7');
insert into t values(
1008,03,666,'2007.3.4');
insert into t values(
1008,03,666,'2007.3.5');
create view v2 as
select t1.u_id,t1.m_id,t1.q_id,max(t1.dt) dt
from t t1,t t2
where t1.u_id=t2.u_id and t1.m_id=t2.m_id and t1.q_id=t2.q_id
group by t1.u_id,t1.m_id,t1.q_id
order by t1.u_id,dt desc;
select * from (
select row_number() over (partition by 读者id,杂志id,杂志期号 order by 读者id,杂志id,杂志期号,点击时间 desc) rn,t.*
from
(
select 杂志id,杂志期号,读者id,max(点击时间) as 点击时间 from table Group by 杂志id,杂志期号,读者id
) t
)
where rn<=5
select u_id,m_id,q_id,dt
from
(select u_id,m_id,q_id,dt,rank() over (partition by u_id order by dt desc) as ord
from v2)
where ord <=5;U_ID M_ID Q_ID DT
------ -------- ---- ------------
555 1001 8 2007.3.9
1008 1 2007.3.9
1001 1 2007.3.7
1002 1 2007.3.6
1008 3 2007.3.5
666 1001 8 2007.3.9
1008 1 2007.3.9
1002 3 2007.3.8
1001 1 2007.3.7
1002 1 2007.3.6
888 1001 8 2007.3.9
1008 1 2007.3.8
1001 1 2007.3.7
1002 3 2007.3.7
1002 1 2007.3.6已选择15行。
------ -------- ---- --------------
555 1001 8 2007.3.9
1008 1 2007.3.9
1001 1 2007.3.7
1002 1 2007.3.6
1008 3 2007.3.5
1002 3 2007.3.4
666 1001 8 2007.3.9
1008 1 2007.3.9
1002 3 2007.3.8
1001 1 2007.3.7
1002 1 2007.3.6
1008 3 2007.3.5
888 1001 8 2007.3.9
1008 1 2007.3.8
1001 1 2007.3.7
1002 3 2007.3.7
1002 1 2007.3.6
1008 3 2007.3.5已选择18行。只是大概做出来了,完全没考虑性能 请多指教!
------ -------- ---- ----------------
555 1001 8 2007.3.9
1001 1 2007.3.7
1002 1 2007.3.6
1008 3 2007.3.5
1008 1 2007.3.9
666 1001 8 2007.3.9
1001 1 2007.3.7
1002 3 2007.3.8
1002 1 2007.3.6
1008 1 2007.3.9
888 1001 8 2007.3.9
1001 1 2007.3.7
1002 3 2007.3.7
1002 1 2007.3.6
1008 1 2007.3.8已选择15行。
可以做出这样的效果来.
不知有何意见
from t t1,t t2
where t1.u_id=t2.u_id and t1.m_id=t2.m_id and t1.q_id=t2.q_id
group by t1.u_id,t1.m_id,t1.q_id就保证了 每个用户所读的每种杂志的每期的最新时间,而且绝不会重复,剩下就是排序方面的问题了.请楼主把 需求描述清楚些.
高手们给出些比较简洁的方法来吧!
FROM(
SELECT t.*,
rank()over(PARTITION BY t.u_id ORDER BY t.dt DESC ,t.m_id,t.Q_ID, t.u_id ) ord
FROM(
SELECT DISTINCT
t.U_ID u_id,
t.M_ID m_id,
t.Q_ID q_id,
max(t.dt) dt
FROM t
GROUP BY
t.U_ID,
t.M_ID,
t.Q_ID
ORDER BY
t.U_ID,
dt DESC
) t
)t
WHERE t.ord <= 5
谢谢smallsophia() 的思路,
但在这指出smallsophia()其中有一点点小BUG,
就是在partition中没考虑回出现重复的ord.
如果上面 555 1002 3 2007.3.4 这条数据改成
555 1002 3 2007.3.5 问题就出来了.
我把我写的代码放上来以供参考,我也是个初学者.
大家一起学习