4

我有一个表,用于存储 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,运行另一个查询来获取具有“最新”page_hit_timestamp 的页面,和所有这些页面的总和。(对于上面的示例数据,info.html 的计数为 2,faq.html 的计数为 1。)

但是,我想知道的是:有没有办法将这两个查询组合成一个 sql 语句 - 或者我是否必须为此走存储过程路线?

我看过使用 join,但我不知道它是否适用于这种情况。

PS - 我知道我可以在我的应用程序中使用 Google Analytics 之类的工具来为我提供这些信息,但是 a)这是一个移动网络应用程序,所以不适合现成的分析工具,b)我只是好奇知道这是否可以在 SQL 中完成。

4

4 回答 4

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
于 2010-01-20T21:28:02.653 回答
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 组合返回一行,该行将包含:

  • http_session_id
  • page_name
  • (http_session_id+page_name) 组合在表中出现的次数
  • 组合的最新 (MAX) 时间戳
于 2010-01-20T21:28:54.393 回答
0

你能提供你的两个查询吗,我可以很容易地把它们变成一个 JOIN ,或者根据你的需要可能是一个子查询。

于 2010-01-20T21:27:45.820 回答
0

下面的查询列出了最后访问的页面,

选择 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
) 其中 rn=1;


如果你想计数,那么下面的查询可能会有所帮助

选择 page_name,count(*) from (select
row_number() over( 按 t.http_session_id 分区 order by t.page_hit_timestamp desc) rn,t.* from weblog t
) 其中 rn=1
按 page_name 分组;
于 2010-01-21T08:11:51.367 回答