我有一个表,用于存储Web应用程序中的页面命中,存储
unique_row_id http_session_id page_name page_hit_timestamp
----------------------------------------------------------------
0 123456789 index.html 2010-01-20 15:00:00
1 123456789 info.html 2010-01-20 15:00:05
2 123456789 faq.html 2010-01-20 15:00:15
3 987654321 index.html 2010-01-20 16:00:00
4 987654321 faq.html 2010-01-20 16:00:05
5 987654321 info.html 2010-01-20 16:00:15
6 111111111 index.html 2010-01-20 16:01:00
7 111111111 faq.html 2010-01-20 16:01:05
8 111111111 info.html 2010-01-20 16:01:15
我想运行一个sql查询,它会向我显示用户最终浏览的最常见页面。
所以我最初的想法是,在我的(java)应用程序中,我可以运行一个查询,从表中选择不同的http_session_id值,然后对于每个不同的http_session_id,运行另一个获取带有'latest'的页面的查询'page_hit_timestamp,并将所有这些页面的总和相加。 (对于上面的示例数据,info.html的计数为2,faq.html的计数为1.)
但是,我想知道的是:有没有办法将这两个查询组合成一个单独的sql语句 - 或者我是否必须将存储过程路由下去呢?
我已经看过使用join了,但我无法弄清楚它是否适用于这种情况。
PS - 我知道我可以在我的应用程序中使用Google Analytics这样的信息来为我提供此信息,但a)这是一个移动网络应用程序,因此不适合现成的分析工具,而且b)我是只是想知道这是否可以在SQL中完成。答案 0 :(得分:5)
这应该做你想要的:
select 1.page_name, count(*) as ExitPageCount
from WebLog l
inner join (
select http_session_id, max(page_hit_timestamp)
from WebLog
group by session
) lm on l.http_session_id = lm.http_session_id and l.page_hit_timestamp = lm.page_hit_timestamp
group by 1.page_name
答案 1 :(得分:3)
SELECT http_session_id, page_name, COUNT(page_name), MAX(page_hit_timestamp)
FROM table
GROUP BY http_session_id, page_name
这将为每个http_session_id和page_name组合返回一行,该行将包含:
答案 2 :(得分:0)
您能否提供两个查询,我可以轻松地将它们转换为JOIN,或者根据您的需要将其转换为子查询。
答案 3 :(得分:0)
下面的查询列出了最后访问的页面,
select http_session_id,page_name,page_hit_timestamp from (select row_number() over( partition by t.http_session_id order by t.page_hit_timestamp desc) rn,t.* from weblog t ) where rn=1;
如果你想要数,那么下面的查询可能会有所帮助
select page_name,count(*) from (select row_number() over( partition by t.http_session_id order by t.page_hit_timestamp desc) rn,t.* from weblog t ) where rn=1 group by page_name;