SQL - объединить два отдельных запроса SQL - PullRequest
4 голосов
/ 21 января 2010

У меня есть таблица, в которой хранятся хиты страниц в веб-приложении, где хранится

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, и суммировать для всех этих страниц. (Для приведенных выше примеров у меня будет счет 2 для info.html и 1 для faq.html.)

Но что я хотел бы знать, так это: есть ли способ объединить эти два запроса в один оператор SQL - или для этого мне нужно пройти по маршруту хранимой процедуры?

Я рассмотрел использование объединения, но не могу понять, применимо ли это в этом сценарии.

PS - я знаю, что могу использовать подобные Google Analytics в своем приложении, чтобы предоставить мне эту информацию, но а) это мобильное веб-приложение, поэтому оно не очень подходит для стандартных инструментов аналитики, и б) я просто интересно узнать, можно ли это сделать в SQL.

Ответы [ 4 ]

5 голосов
/ 21 января 2010

Это должно делать то, что вы хотите:

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
3 голосов
/ 21 января 2010
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
  • имя_страница
  • количество раз, которое комбинация (http_session_id + page_name) встречается в таблице
  • последняя (МАКС.) Временная метка для комбинации
0 голосов
/ 21 января 2010

В приведенном ниже запросе перечислены последние просмотренные страницы,

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;
0 голосов
/ 21 января 2010

Можете ли вы предоставить два ваших запроса, я мог бы легко превратить их в JOIN или, возможно, в подзапрос, в зависимости от ваших потребностей.

...